台式电脑上的 Slurm,如何确定所有者的优先级

台式电脑上的 Slurm,如何确定所有者的优先级

简而言之:在 Slurm 集群上,我需要一些计算机在工作时间可用并对其各自的所有者做出响应。

问题:我管理一个小型(但不断增长的)异构集群,包含大约 10 个节点,其中一些节点不是专用的。这些是同事在工作时间在同一网络上使用的台式计算机,他们更喜欢在响应式计算机上工作。然而,在晚上和周末,我们将所有计算机和一些专用节点集中在一起进行批处理作业。

我最近从 HT Condor 切换到 Slurm,因为它在所有方面都更符合我们的需求,除了一个方面:优先考虑机器所有者与集群无关的常规工作。在 Condor 上,节点可以配置为挂起、抢占或终止作业,具体取决于以下条件:

  • 一天中或工作日的时间(机器在工作日的白天使用)
  • 键盘活动(某些用户可能工作到很晚)
  • 来自集群生成的进程以外的进程的 CPU 活动(用户可能会让自己的一些进程整夜运行,这些进程应该在不受干扰的情况下运行)

我想在使用 Slurm 时模仿这些行为,或者找到一种方法不打扰使用计算机的主人。

附加信息:所有节点都使用 Ubuntu 18.04-19.04,并在 apt 中找到 slurm,即版本 18+。集群使用 cgroup 来实施限制,并配置为使用核心作为可消耗资源,如下所示

SelectType=select/cons_res
SelectTypeParameters=CR_Core

我在大多数台式计算机上没有 sudo 权限,因此我需要一种“一劳永逸”的解决方案(当我配置同事的 PC 时),或者我可以从拥有 sudo 的头节点执行某些操作。

尝试:我已经考虑过这些选择,但仍然不满意:

  • 对于一天/工作日的时间,使用 crontab 或 systemd 以及 slurmd.service 中的 OnCalendar 事件来:
    • 启动/停止守护进程。这可能是最简单的方法,但会以不干净的方式杀死工作。
    • 启动一个脚本,使用 scontrol 将节点状态设置为 down/resume/drain/etc(可能从头节点)。我还没有尝试过这个,因为我不知道如何在 scontrol 交互模式之外做到这一点。
  • 为了提高响应速度,请使用“systemd edit slurmd.service”通过在[Service]下设置CpuWeight=5来添加资源控制。这应该优先考虑所有其他进程,但似乎并没有按照我的预期工作,因为这些工作无论如何都会使计算机变得缓慢。我认为作业将是 slurmd 的子进程,并且受到相同的 CpuWeight 的影响。如果这确实有效的话,它可以解决整个问题。

我觉得应该有更好的方法来实现我想要的。任何帮助表示赞赏。

答案1

几天后,我设法回答了我自己的问题。事后看来,这很简单。

响应能力: slurmd 守护进程可以使用命令行参数启动,用slurmd -h.特别是,slurmd -n 19为守护进程及其所有子进程设置最高的nice-value(因此优先级最低)。在台式电脑上,我只需

  • 编辑后/etc/systemd/system/slurmd.service附加-n 19ExecStart,即ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS -n 19
  • 重新加载 systemd 守护进程systemctl daemon-reload
  • 重新启动 slurmd 守护进程,systemctl restart slurmd.service

内存预留: 可以为系统保留一些内存。我通过添加MemSpecLimit=8000到 中的节点规格,将 8GB 留给所有者slurmd.conf。要实际强制执行内存限制,还需要执行一些额外的步骤:

  • SelectTypeParameters=CR_Core_Memory通过在 中进行设置,选择 Core 和 Memory 作为消耗资源slurmd.conf

  • TaskPlugin=task/affinity,task/cgroup通过设置添加 cgroups 任务插件slurmd.conf,然后ConstrainRAMSpace=yes在 中设置cgroup.conf

  • GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"因为我们使用的是 Ubuntu,所以通过添加以下行来启用内存和交换 cgroup/etc/default/grub

工作日工作时间 我的一些同事希望在工作时间零分心。这很容易scontrol从头节点完成,在工作时间将其节点状态设置为“关闭”,并在工作时间后“恢复”。我使用 systemd 计时器自动执行此操作:

  • 首先,创建一个可执行脚本,使用以下命令更新相关桌面的节点状态scontrol
#!/bin/bash
# slurm-update.sh - Updates the state on nodes belonging to the work-hour desktops partition.
systemctl start slurmd
for node in $(sinfo -h --partition=WHdesktops --format="%n"); do
        state=$(sinfo -h --node=$node --format="%T")
        echo "Setting node $node to state=$1 with reason=$2"
        scontrol update NodeName=$node state=$1 reason="$2" || echo "State on $node is already $(sinfo -h --node=$node --format=\"%T\")"
done

这需要两个参数:新状态及其原因。

  • 在目录中创建服务/计时器文件对,/etc/systemd/system以在特定时间运行上面的脚本。每个您想要设置的状态制作一对(例如,我制作了 3 对,用于设置、排水和恢复)。设置“向下”的一对看起来像这样
# /etc/systemd/system/slurm-down.service:
[Unit]
Description=Shut down all SLURM desktop nodes
[Service]
Type=simple
ExecStart=/bin/bash /mnt/nfs/slurm_fs/systemd/slurm-update.sh down afterhours
StandardError=journal

# /etc/systemd/system/slurm-down.timer:
[Unit]
Description=Timer for shutting down slurm on desktop nodes on weekdays
[Timer]
Unit=slurm-down.service
OnBootSec=10min
# Run hourly on weekdays between 8:05 to 18:05
OnCalendar=Mon..Fri *-*-* 8..18:05:00
[Install]
WantedBy=multi-user.target
  • 使用重新加载守护程序systemctl daemon-reload,然后仅启用并启动计时器,而不是服务:systemctl enable --now slurm-down.timer

  • 在下班后重复恢复状态的步骤,并可选择在停机状态前一小时左右重复执行排水状态。

相关内容