Slurm 在 20.02 之后增加了 Configless 的功能,也就是说不需要在每一个运行 slurmd 的结点维护所有的配置文件了。 这对于 HPC 集群的运维来说肯定是好消息。原本需要时刻保持 N 份配置文件相同,否则就容易产生玄学而难以诊断的问题,而一致性永远是计算机科学中的难题。 现在只需要在 slurmctld 对应的控制结点上维护一份配置,其他结点的 slurmd 启动时会自动拉取最新的配置,而运行时 reconfig 也不用担心受到本地配置的影响。
Slurm 的文档指出,实现 configless 满足进行以下要求:
- 使得 slurmd 能找到 slurmctld:可以通过 DNS SRV 记录或者启动时传递
--conf-server
参数达成; - 如果使用 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 后解决。