3、SLURM架构与安装:slurmctld、slurmd、sacctmgr与munge认证
SLURM这玩意儿,说白了就是一套“调度系统”。你把它装好了,集群里的CPU、GPU才算真正能被管起来。我早期部署集群时,踩过不少坑,尤其是架构没理清就开始装,后面改配置改到怀疑人生。今天咱们先把骨架搭明白。
3.1 SLURM核心组件
一个SLURM集群里,主要有三个角色在干活,咱们一个一个说。
- slurmctld(中央管理守护进程):大脑。跑在管理节点上,负责接收作业、调度资源。我习惯把它装在单独的“头节点”上,别跟计算节点混用,万一崩了全集群都懵。
- slurmd(计算节点守护进程):手脚。每个计算节点上都得跑一个,听候slurmctld的指挥,启动/监控任务。
- sacctmgr:账户管理工具。用来建账户、关联用户与QoS。我记得有一次生产环境被人误建了一堆没上限的账户,资源瞬间被刷爆——按QoS限流不是开玩笑的。
- slurmdbd:数据库守护进程。把作业计费和账户信息持久化到MySQL/MariaDB里。小型集群可以不用,但我建议但凡超过20个节点,给它整上。
- scontrol:管理员调试神器。查看节点状态、修改配置、排空节点,全靠它。
3.2 架构与工作流程
我用一张图来给你理一理整个脉络。你想想看,一个作业从提交到跑起来,到底经过了哪些手?
看到没?slurmctld是核心调度员,它跟每个slurmd保持心跳连接。用户提交作业后,调度器会根据节点状态、分区、QoS作出决策。我曾在混部集群里见过因为心跳间隔设太长导致“僵尸作业”的情况——所以先把架构跑通再调优。
3.3 安装方式选择
SLURM的安装,我一般看场景选方案。下面这个表格是我自己整理的选型指南。
| 安装方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| yum / apt 包管理器 | 最省心,小集群/快速验证 | 依赖自动解决;升级方便 | 版本通常滞后;缺少自定义特性 |
| 源码编译安装 | 需要最新特性;定制调度插件 | 完全可控;可打补丁 | 编译有门槛;升级麻烦 |
| Spack / EasyBuild | HPC环境统一管理 | 模块化;多版本并存 | 学习曲线略高 |
3.3.1 yum/apt 安装(推荐起步)
如果你只是想搭个测试环境或者集群节点少于50台,直接用包管理器。我演示一下CentOS 7上的操作。
# 在管理节点(头节点)
yum install -y slurm slurm-slurmctld slurm-sacctmgr
# 在每个计算节点
yum install -y slurm slurm-slurmd
Ubuntu/Debian上类似:
apt install -y slurm-wlm slurm-wlm-bridge-plugins
munge包是否存在。yum list installed | grep munge看一眼就行。
3.3.2 源码编译安装(生产环境推荐)
我个人习惯在正式生产环境用源码编译。为什么?因为可以按需裁剪特性,比如PMIx、HDF5、GPU绑核这些。编译参数我踩过雷,你把下面这段直接拿过去跑就好。
# 下载源码(以23.11 LTS为例)
wget https://download.schedmd.com/slurm/slurm-23.11.4.tar.bz2
tar -xjf slurm-23.11.4.tar.bz2
cd slurm-23.11.4
# 配置,开启常用插件
./configure \
--prefix=/usr/local/slurm \
--sysconfdir=/etc/slurm \
--enable-mpi \
--enable-pam \
--with-munge=/usr \
--with-hdf5=/usr/local/hdf5
# 编译并安装
make -j$(nproc)
make install
我问你一个细节:你有没有遇到过编译完启动报错说找不到libslurm.so?那是因为你没把库路径告诉ldconfig。加一行:
echo "/usr/local/slurm/lib" > /etc/ld.so.conf.d/slurm.conf
ldconfig
这是一定要做的,否则slurmctld启动就报错,白白浪费时间。
3.4 配置munge认证
SLURM集群里所有节点之间通信,默认靠munge来互认身份。
说白了,munge像是一个“秘密握手协议”。管理节点和计算节点必须使用同一个密钥文件,否则slurmd连不上slurmctld,作业也跑不了。
3.4.1 munge安装
# 管理节点和所有计算节点都要装
yum install -y munge munge-libs munge-devel
# 或者 apt:
apt install -y munge libmunge-dev
3.4.2 生成并分发密钥
我只在管理节点上生成密钥,然后用scp推送给所有计算节点。统一密钥,是最关键的步骤。
# 在管理节点上
create-munge-key -f /etc/munge/munge.key
chown munge:munge /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
# 将密钥拷贝到所有计算节点(假设计算节点IP列表文件)
for host in $(cat compute_nodes.txt); do
scp /etc/munge/munge.key $host:/etc/munge/
ssh $host "chown munge:munge /etc/munge/munge.key && chmod 400 /etc/munge/munge.key"
done
3.4.3 启动munge服务
# 所有节点执行
systemctl enable munge
systemctl start munge
# 验证(任意节点)
munge -n | unmunge | grep "STATUS:"
# 输出正常应显示:STATUS: Success
如果返回的是Failed,八成是密钥未同步或者munge用户uid不一致。我建议所有节点的munge用户uid都固定,避免NFS挂载后权限冲突。
3.4.4 在SLURM配置中启用munge
编辑/etc/slurm/slurm.conf,设置认证方式。
# 关键行
AuthType=auth/munge
CryptoType=crypto/munge
然后重启slurmctld和slurmd:
systemctl restart slurmctld
# 在计算节点上
systemctl restart slurmd
scontrol ping测试所有计算节点是否连通。如果某节点显示“DOWN”,先检查munge——80%的情况都是密钥搞不定。
3.5 安装后的快速验证
装完别急着跑业务,先跑一轮自检。这是我自己一直在用的脚本片段:
# 检查slurmctld是否存活
systemctl status slurmctld
# 查看节点状态
sinfo
# 最简单的作业提交测试
srun -N 1 hostname
# 检查作业队列
squeue
如果sinfo显示所有节点状态为idle,而且srun能正确返回主机名,说明你的SLURM已经能正常工作了。嗯,到这个阶段,架构和安装这块就算稳了。后续的精细化调优,咱们到后面的作业管理和监控章节再细聊。