在 Debian 上配置 Configless Slurm

 

Slurm 在 20.02 之后增加了 Configless 的功能,也就是说不需要在每一个运行 slurmd 的结点维护所有的配置文件了。 这对于 HPC 集群的运维来说肯定是好消息。原本需要时刻保持 N 份配置文件相同,否则就容易产生玄学而难以诊断的问题,而一致性永远是计算机科学中的难题。 现在只需要在 slurmctld 对应的控制结点上维护一份配置,其他结点的 slurmd 启动时会自动拉取最新的配置,而运行时 reconfig 也不用担心受到本地配置的影响。

Slurm 的文档指出,实现 configless 满足进行以下要求:

  1. 使得 slurmd 能找到 slurmctld:可以通过 DNS SRV 记录或者启动时传递 --conf-server 参数达成;
  2. 如果使用 SRV 记录,需要保证 slurmd 启动时本地没有任何配置(因为 搜索顺序 中 SRV 记录优先级最低)。

由于我们的集群中有不止一套 Slurm,也就需要给不同的 slurmd 指定不同的 slurmctld,简单起见我选择了传参的方案。以 Debian 的 slurm-wlm 为例说明修改:

修改 /etc/default/slurmd,添加 --conf-server 参数:

SLURMD_OPTIONS="--conf-server your_ctl_server:6817"

尽管按照文档,这样就能工作了,为了保险起见,还可以通过 systemd 对 slurmd 隐藏 /etc/slurm 的配置(而不是真的删除),避免潜在的冲突/混淆问题。运行 systemctl edit slurmd

[Unit]
ConditionPathExists=

[Service]
TemporaryFileSystem=/etc/slurm

由于 Debian 分发的 service unit 中检测了 /etc/slurm/slurm.conf 作为启动条件,因此在 [Unit] 节中通过空配置覆盖来禁用它,然后在 [Service] 节中通过挂载临时文件系统隐藏原有目录。 重启服务后,可以通过 /proc/$(pgrep slurmd)/root/etc/slurm 的内容检查是否正常工作。

我按照上面的方法将实验室所有集群替换成了 configless 模式,目前工作一切正常。遇到的唯一问题是 GRES 配置有时无法通过 reconfig 更新,在尝试删除配置 - reconfig - 加回配置 - reconfig 后解决。