【问题标题】:How does slurm determine memory usage of jobsslurm 如何确定作业的内存使用情况
【发布时间】:2018-01-12 17:10:46
【问题描述】:

最近一个用户在我们的集群上运行一个交互式作业。我们使用 slurm 作为工作负载管理器。他通过以下方式获得分配:

 salloc --cpus-per-task=48 --time=14-0 --partition=himem

这需要我们集群上的整个高内存 (1.5TB) 机器。他跑了他的工作。当它运行时,在他的屏幕上他收到了错误消息(或类似的东西):

salloc: Error memory limit exceeded

我登录到节点,使用top,他的工作只占用了 310GB 的 RES。然而,在 slurmd.log 中有大量错误(跨越 8 小时!),如下所示:

[2017-08-03T23:21:55.200] [398692.4294967295] Step 398692.4294967295 exceeded memory limit (1588997632 > 1587511296), being killed

问题:为什么 top 认为他使用的是 310GB 而 slurm 认为他使用的是 1.58TB?

【问题讨论】:

  • 因为 slurm 据报道杀死了一个进程,可能在某个时间点确实有一个用户生成了一个使用 1.5TB 的进程,但是当你登录时它已经消失了。如果你碰巧有一个 RedHat 或衍生系统,你可能有 sadc 运行并每隔 10 分钟收集一次内存使用数据来检查这个假设。
  • 我觉得不是这样,上面Step 398692.报的pid和310GB进程的pid匹配。我正在观看top 和 slurm 日志,而它正在生成所有 Step 398692.4294967295 exceeded memory limit 错误。当它产生这些错误时,根本没有任何进程拥有这么多内存。

标签: slurm


【解决方案1】:

为了回答这个问题,Slurm 使用/proc/<pid>/stat 来获取内存值。就您而言,正如@Dmitri Chubarov 所建议的那样,您可能无法目睹被 Slurm 杀死的犯罪过程。

另一种可能是您遇到了最近在 17.2.7 版本中更正的 Slurm 错误。来自变更日志:

-- 增加缓冲区以处理长 /proc//stat 输出,以便 Slurm 可以读取正确的 RSS 值并对使用更多的作业执行操作 内存超出请求。

Slurm 反复尝试终止进程的事实(您在日志中提到了多次出现的条目)表明机器内存不足,slurmd 在尝试终止进程时遇到问题。我建议您激活cgroups 进行任务控制;它更加健壮。

【讨论】:

  • 感谢您指出这一变化。与此更改相关的错误是:bugs.schedmd.com/show_bug.cgi?id=3999。我们目前正在为 slurm 使用 cgroups 插件。在错误修复中,他们将缓冲区的长度从 256->512 字节更改。我将看看是否可以复制错误并检查 /proc//stat 的长度。我遇到的问题与错误中描述的问题有点不同,但绝对值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2010-11-26
  • 2018-07-28
  • 1970-01-01
  • 2023-03-21
  • 2013-11-26
相关资源
最近更新 更多