【问题标题】:Monitor the CPU usage of an OpenFOAM simulation running on a slurm job监控在 slurm 作业上运行的 OpenFOAM 模拟的 CPU 使用率
【发布时间】:2023-07-04 18:20:02
【问题描述】:

我正在集群上运行 OpenFOAM 模拟。我用过the Scotch decomposition method,我的decomposeParDict 看起来像这样:

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      decomposeParDict;
}
numberOfSubdomains 6;
method          scotch;

checkMeshdecomposePar 顺利完成。我已经为 slurm 分配了 6 个节点

srun -N6 -l sonicFoam

求解器运行平稳,没有任何错误。

问题是与我之前运行的非并行模拟相比,解决方案速度没有提高。我想监控 CPU 使用情况,看看我分配的所有 6 个节点是否都被类似地加载。 squeue --user=foobar 命令返回 jobNumber 和分配的节点列表 (NODELIST(REASON)),如下所示:

foo,bar[061-065]

来自sinfo 命令,这些节点都在debugmain* PARTITIONs 中(我完全不知道这意味着什么!)。

This post 表示您可以使用sacctsstat 命令来监控 slurm 作业的 CPU 时间和内存使用情况。但是当我运行时

sacct --format="CPUTime,MaxRSS"

它给了我:

 CPUTime     MaxRSS
---------- ----------
  00:00:00
  00:00:00
  00:07:36
  00:00:56
  00:00:26
  15:26:24

我无法理解。当我通过

指定工作编号时
sacct --job=<jobNumber> --format="UserCPU"

返回是空的。所以我的问题是

  • 我的模拟是在加载所有节点,还是在一个或两个节点上运行,其余的都是免费的?
  • 我运行的命令是否正确?如果是,这些数字是什么意思?它们如何表示每个节点的 CPU 使用率?
  • 如果不是,那么对于 sacct 和/或 sstat(或者可能是其他 slurm 命令)获取 CPU 使用率/负载的正确 --format="..."s 是什么?

P.S.1. 我在the official instructions 之后关注了 OpenFOAM 编译。我没有对OpenMPI 做任何事情,但它是mpicc 编译器。

P.S.2 对于那些可能会在这里结束的人。也许我运行了错误的命令,显然可以通过以下方式分配一些资源:

srun -N 1 --ntasks-per-node=7 --pty bash

其中 7 是您想要的核心数,而 bash 只是一个名称。然后运行求解器:

mpirun -np 7 sonicFoam -parallel -fileHandler uncollated

不过我还不确定。

【问题讨论】:

  • 如果您可以在模拟运行时通过 SSH 连接到计算节点,您只需登录并使用top 命令即可确定进程是否存在并正在运行。你也可以pstack &lt;pid&gt;查看它在哪里。
  • 您能详细说明一下吗?如何获取节点的IP地址?
  • squeue 列出作业运行时分配给作业的节点,然后您可以简单地通过主机名 SSH 到它们。
  • 但是如何找到这些特定节点的主机名?
  • 一个作业有 6 个节点,您可以尝试一个较小的作业或对所有 6 个节点重复操作。

标签: openmpi slurm openfoam


【解决方案1】:

你可以使用

sacct --format='jobid,AveCPU,MinCPU,MinCPUTask,MinCPUNode'

检查是否所有 CPU 都处于活动状态。比较AveCPU(作业中所有任务的平均 CPU 时间)和MinCPU(作业中所有任务的最小 CPU 时间)。如果它们相等,则所有 6 个任务(您请求 6 个节点,每个节点隐含 1 个任务)工作相同。如果它们不相等,甚至MinCPU 为零,那么某些任务一直没有执行任何操作。

但在你的情况下,我相信你会观察到所有任务都在努力工作,但他们都在做同样的事情。

除了@timdykes 关于-parallel 标志的评论之外,您还必须注意,使用sun 启动MPI 作业需要使用Slurm 支持编译OpenMPI。在您安装 OpenFOAM 的过程中,它安装了自己的 OpenMPI 版本,如果文件 /usr/include/slurm/slurm.h/usr/include/slurm.h 存在,则可能编译了 Slurm 支持。但最安全的可能是使用 mpirun

但要做到这一点,您必须首先使用 sbatchsalloc 从 Slurm 请求分配。

【讨论】:

  • 我的意思可能是 Slurm 中没有配置记帐。 scontrol show config | grep JobAcctGatherType 的输出是什么?
  • 1. OpenFOAM 不使用预安装的 OpenMPI,它带有自己的版本,当您运行 ./Allwmake 时会编译该版本。因此,在您的 OpenFOAM 目录中的某个地方,必须是一个 OpenMPI 目录和一个 config.log,其中包含如何编译 OpenMPI 的详细信息。
  • 2.不,它确实不是随你的 OpenFOAM 安装的,它是随 Slurm 安装的。但是你的 OpenFOAM 一定是在编译时选择了它。
  • 3.互动选项:salloc -N6 &lt;ENTER&gt; mpirun sonicFoam。批处理选项:sbatch -N6 --wrap "mpirun sonicFoam"
  • jobacct_gather/none 表示恐怕没有收集到信息。
【解决方案2】:

您是否尝试过使用“-parallel”参数运行?所有在线 OpenFOAM 示例在运行并行作业时都使用此参数,一个示例是用于并行运行的 official guide

srun -N $NTASKS -l sonicFOAM -parallel

顺便说一句 - 我看到你自己构建了 openfoam,你检查过集群管理员是否为它提供了一个模块吗?您通常可以运行 module avail 来查看可用模块的列表,然后运行 ​​module load moduleName 如果存在现有的 OpenFOAM 模块。这很有用,因为您可能相信它是使用所有正确选项构建的,并且会自动设置您的 $PATH 等。

【讨论】:

  • 感谢您的帖子: 1. 我尝试了module avail,但没有可用的 OpenFOAM 模块。没有预期。该服务器是为神经网络人员设计的,我有点滥用它来进行 CFD :) 2. 我不知道-parallel 标志,因为the official page for OpenFOAM parallelization 中没有提到它。我现在就试试。 3.Here我看到我必须用mpirun运行代码。我也要去试试。但仍然无法比较它们,因为我无法监控 CPU。
  • 我检查了: 1. mpirun -np 6 sonicFoam -parallel 工作但仍然无法判断它是否正在收集所有 6 个节点/CPU。 2. 有点奇怪,但这也运行srun -N6 -l mpirun -np 6 sonicFoam -parallel 也运行! 3.srun -N6 -l sonicFoam -parallel 导致一个很长的我无法理解的神秘错误。也许我可以记录它并发布一个新问题。
  • 关于 2. 虽然文本中没有明确提及该参数,但您可以在 3.2.3 的示例中看到它,并且在谷歌上搜索“OpenFOAM example slurm”会显示很多示例所有这些都使用 -parallel 标志。对于 3. 您需要使用适合您机器的 MPI 启动包装器,如果它是带有 SLURM 的集群(看起来像),那么 srun 可能是最合适的命令。如果不确定,您应该咨询您的管理员(可能您有一个集群的“入门”指南,其中解释了 MPI 作业的适当用法?)。
  • 我还没有将OpenFOAMslurm 放在一起。现在就去做。并返回结果。感谢您的提示。
最近更新 更多