把 slurm.conf 写准
一句话总结
slurm.conf 是所有节点必须保持一致的唯一事实来源。只要有一个节点不同,它就会悄无声息地退出集群。
为什么需要理解这些内容
Slurm 配置错误的特点是:错误出现得很晚,而且出现在意想不到的地方。节点进入 INVAL 或 DOWN 状态,日志里其实已经用一行说明了原因;但如果没有看到这一行,人们可能会排查好几天。
它是如何工作的
必需配置项
ClusterName=labhub-hpc
SlurmctldHost=ctl01
SlurmUser=slurm
SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd
SlurmctldPidFile=/run/slurmctld.pid
SlurmdPidFile=/run/slurmd.pid
AuthType=auth/munge
ClusterName—— 使用同一个数据库管理多个集群时的标识符,必须为小写。SlurmctldHost—— 控制器的主机名,所有节点都必须能通过 DNS 或 hosts 解析它。SlurmUser—— 运行 slurmctld 的账户,通常使用专用的slurm账户。StateSaveLocation—— 保存队列与作业状态的位置。 丢失这个目录,正在运行的作业信息也会消失。在高可用配置中,应将其放在共享存储上。
调度与资源选择
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup,task/affinity
SelectType=select/cons_tres—— 不再以整台节点为单位,而是把资源拆分到核心、内存和 GRES 级别进行分配。它在 GPU 集群中几乎是必需的,旧名称是cons_res。SelectTypeParameters=CR_Core_Memory—— 把核心和内存都视为可消耗资源。如果不计入内存,超出内存容量的作业会集中到同一节点并触发 OOM。ProctrackType=proctrack/cgroup—— 使用 cgroup 跟踪作业进程。缺少它时,即使作业结束,子进程也可能继续残留。TaskPlugin=task/cgroup—— 通过 cgroup 强制实施资源隔离。正是这个插件让未申请的 GPU 对作业不可见。
节点定义
NodeName=gpu-node01 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 CPUs=64 RealMemory=257000 Gres=gpu:a100:8 State=UNKNOWN
这里有两个最常见的错误。
CPUs与Sockets × CoresPerSocket × ThreadsPerCore的计算结果不同。 此时 slurmctld 会以Low socket*core*thread count为由,将节点置于INVAL状态。- 把
RealMemory设得比实际物理内存更大。 如果配置值高于节点报告的值,节点会因Low RealMemory进入 DOWN 状态;反过来,配置得过小又会浪费内存。惯例是扣除操作系统占用的部分后再填写——例如 256 GB 节点可填写约RealMemory=257000(单位为 MB)。
可以通过 slurmd -C 查看节点的实际值。直接粘贴它的输出是最安全的做法。
分区定义
PartitionName=batch Nodes=gpu-node[01-03] Default=YES MaxTime=24:00:00 State=UP
PartitionName=short Nodes=gpu-node[01-03] MaxTime=01:00:00 Priority=100 State=UP
Nodes=中列出的节点必须全部通过 NodeName 定义。引用不存在的节点时,会出现partition ... has unknown node ...警告,该节点也会被忽略。Default=YES只能赋给一个分区。- 可以使用
gpu-node[01-03]这样的范围表示法。
日志与状态
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log
AccountingStorageType=accounting_storage/none
JobAcctGatherType=jobacct_gather/cgroup
ReturnToService=2
ReturnToService=2 允许处于 DOWN 状态的节点在使用有效配置重新注册后自动恢复。默认值 0 则要求管理员显式执行 RESUME。
修改之后
scontrol reconfigure # 대부분의 변경은 이것으로 반영
systemctl restart slurmctld # 일부 핵심 변경은 재기동 필요
scontrol show config | head -40
不要忘记把配置文件部署到所有节点。 只要一个节点的文件不同,它就会悄无声息地退出。因此,大多数集群会把 /etc/slurm 放在共享存储上,或者通过配置管理系统分发。
实际工作中会遇到的情况
没有直接采用 slurmd -C 输出而引发的问题。 手工计算时漏掉 ThreadsPerCore,或错误计算超线程数量,都会使节点进入 INVAL 状态。最可靠的做法是在该节点运行 slurmd -C,然后原样粘贴输出的那一行。
下一个实验要做什么
根据需求从头编写 slurm.conf,设置正确的 munge 密钥权限,并亲手制作一致性验证脚本。评分器会分别在正常配置和损坏配置下运行这个脚本。