Slurm(Simple Linux Utility for Resource Management)是开源的高性能计算(HPC)资源管理与作业调度系统,广泛用于集群环境的 CPU、GPU 等资源调度。以下是 Slurm 完整部署指南,包含单节点测试、多节点集群部署、基础配置与作业提交,适配科研 / 企业级 HPC 场景:
一、部署前准备(环境要求 + 前置配置)
(一)核心环境要求
| 角色 | 配置规格 | 说明 |
|---|---|---|
| 操作系统 | CentOS 7/8、Ubuntu 20.04/22.04(所有节点一致) | 推荐 CentOS 7(兼容性最佳) |
| 硬件配置 | 控制节点(Controller):2 核 4GB+;计算节点(Compute):2 核 4GB+ | 生产环境根据集群规模扩容(如 100 节点集群控制节点建议 8 核 16GB) |
| 网络要求 | 所有节点互通(内网优先),关闭防火墙或开放必要端口(无固定端口,依赖 RPC 通信) | 控制节点与计算节点需免密 SSH 登录(用于节点通信) |
| 依赖组件 | Munge(身份认证)、MariaDB/PostgreSQL(可选,用于会计存储)、libmunge-devel、openssl-devel | 必须安装 Munge(Slurm 核心认证组件) |
(二)前置操作(所有节点执行)
1. 关闭防火墙与 SELinux
bash
运行
# 关闭SELinux(永久生效,需重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭防火墙(生产环境可按需开放端口,简化部署时直接关闭)
systemctl stop firewalld && systemctl disable firewalld
2. 配置主机名与 hosts 文件(关键!)
-
控制节点 (示例 hostname:slurm-master):
bash
运行
hostnamectl set-hostname slurm-master
-
计算节点 (示例 hostname:slurm-node1、slurm-node2...):
bash
运行
hostnamectl set-hostname slurm-node1 # 每个计算节点修改为唯一主机名 -
所有节点配置
/etc/hosts(添加控制节点与所有计算节点的 IP + 主机名映射):vi /etc/hosts
添加如下内容(替换为实际IP和主机名)
192.168.1.100 slurm-master # 控制节点IP
192.168.1.101 slurm-node1 # 计算节点1IP
192.168.1.102 slurm-node2 # 计算节点2IP
3. 配置控制节点到计算节点的免密 SSH 登录(控制节点执行)
bash
运行
# 生成SSH密钥(一路回车,无需设置密码)
ssh-keygen -t rsa
# 复制公钥到所有计算节点(包括自身,方便本地测试)
ssh-copy-id slurm-master
ssh-copy-id slurm-node1
ssh-copy-id slurm-node2
4. 安装依赖组件(所有节点执行)
-
CentOS 7/8 :
bash
运行
# CentOS 7 yum install -y epel-release yum install -y munge munge-libs munge-devel openssl-devel gcc gcc-c++ make mariadb-server mariadb-devel # CentOS 8 dnf install -y epel-release dnf install -y munge munge-libs munge-devel openssl-devel gcc gcc-c++ make mariadb-server mariadb-devel
Ubuntu:
bash
运行
apt update
apt install -y munge libmunge-dev openssl libssl-dev gcc g++ make mariadb-server libmariadb-dev
二、Slurm 部署(控制节点主导,计算节点同步)
(一)步骤 1:安装与配置 Munge 认证(所有节点执行)
Munge 是 Slurm 节点间身份认证的核心,必须确保所有节点的 Munge 密钥一致。
-
控制节点生成 Munge 密钥:
bash
运行
# 初始化 Munge(生成密钥) dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key chmod 400 /etc/munge/munge.key chown munge:munge /etc/munge/munge.key # 启动 Munge 服务并设置开机自启 systemctl start munge && systemctl enable munge systemctl status munge # 验证状态为 active (running)
2、复制 Munge 密钥到所有计算节点(控制节点执行):
bash
运行
scp /etc/munge/munge.key slurm-node1:/etc/munge/
scp /etc/munge/munge.key slurm-node2:/etc/munge/
3、计算节点启动 Munge 服务(所有计算节点执行):
-
bash
运行
chmod 400 /etc/munge/munge.key chown munge:munge /etc/munge/munge.key systemctl start munge && systemctl enable munge systemctl status munge # 确保启动成功
(二)步骤 2:编译安装 Slurm(所有节点执行)
Slurm 官方推荐编译安装(版本更新快,适配自定义配置),以下以 Slurm 23.11.8(LTS 版本)为例:
-
下载 Slurm 源码包(所有节点执行):
cd /opt wget https://download.schedmd.com/slurm/slurm-23.11.8.tar.bz2 tar -jxvf slurm-23.11.8.tar.bz2 cd slurm-23.11.8 -
编译安装(所有节点执行):
配置编译参数(指定安装路径、依赖库)
./configure --prefix=/usr/local/slurm
--sysconfdir=/etc/slurm
--with-munge=/usr
--with-openssl=/usr
--with-mysql=/usr编译安装(-j 后接CPU核心数,加速编译)
make -j 4 && make install
3. 配置环境变量(所有节点执行,永久生效):
echo 'export PATH=$PATH:/usr/local/slurm/bin:/usr/local/slurm/sbin' >> /etc/profile
source /etc/profile
# 验证安装(显示版本则成功)
slurmctld --version # 控制节点命令
slurmd --version # 计算节点命令
(三)步骤 3:配置 Slurm 核心文件(控制节点执行,计算节点同步)
Slurm 核心配置文件为 /etc/slurm/slurm.conf,需根据集群拓扑自定义。
- 生成基础配置文件(控制节点执行):
cd /opt/slurm-23.11.8/contribs/configurator_easy.html
# 方法1:本地浏览器打开该HTML文件,填写集群信息生成配置(推荐,可视化)
# 方法2:通过命令行生成(示例配置,需根据实际修改)
cat > /etc/slurm/slurm.conf << EOF
# 集群名称(自定义)
ClusterName=hpc-cluster
# 控制节点主机名
ControlMachine=slurm-master
# 控制节点端口(默认6817,无需修改)
ControlPort=6817
# 计算节点端口(默认6818,无需修改)
SlurmdPort=6818
# 节点通信超时时间(秒)
SlurmctldTimeout=300
SlurmdTimeout=300
# 作业账户文件(记录作业归属)
AccountingStorageType=accounting_storage/none # 暂不启用会计功能(后续可配置MariaDB)
# 日志文件路径
SlurmctldLog=/var/log/slurm/slurmctld.log
SlurmdLog=/var/log/slurm/slurmd.log
# 节点配置(NodeName=主机名 CPU=核心数 RealMemory=内存MB State=UNKNOWN)
NodeName=slurm-master CPU=2 RealMemory=4096 State=UNKNOWN # 控制节点也可作为计算节点
NodeName=slurm-node1 CPU=4 RealMemory=8192 State=UNKNOWN
NodeName=slurm-node2 CPU=4 RealMemory=8192 State=UNKNOWN
# 分区配置(PartitionName=分区名 Nodes=节点范围 Default=YES 表示默认分区)
PartitionName=debug Nodes=slurm-master,slurm-node[1-2] Default=YES MaxTime=24:00:00 State=UP
EOF
-
创建日志目录(所有节点执行):
mkdir -p /var/log/slurm
chown root:root /var/log/slurm
chmod 755 /var/log/slurm
复制配置文件到所有计算节点(控制节点执行):
scp /etc/slurm/slurm.conf slurm-node1:/etc/slurm/
scp /etc/slurm/slurm.conf slurm-node2:/etc/slurm/
四)步骤 4:启动 Slurm 服务(控制节点→计算节点)
-
控制节点启动 slurmctld 服务:
启动服务并设置开机自启
systemctl start slurmctld && systemctl enable slurmctld
systemctl status slurmctld # 验证状态为 active (running)
2.计算节点启动 slurmd 服务(所有计算节点执行):
systemctl start slurmd && systemctl enable slurmd
systemctl status slurmd # 验证状态为 active (running)
(五)步骤 5:验证集群状态(控制节点执行)
# 查看节点状态(所有节点显示 IDLE 表示正常)
sinfo
# 输出示例:
# PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
# debug* up 2-00:00:00 3 idle slurm-master,slurm-node1,slurm-node2
# 查看节点详细信息
scontrol show nodes
# 查看 Slurm 服务状态
scontrol show slurmctld
三、Slurm 基础使用:提交与管理作业
(一)作业提交方式(两种核心方式)
1. 交互式作业(实时占用资源,适合调试)
# 申请1个CPU核心,1GB内存,交互登录节点
srun -n 1 -c 1 --mem=1G --pty /bin/bash
# 登录后可执行命令(如运行脚本、编译程序)
hostname # 查看当前所在节点
./your_program.sh # 运行自定义程序
# 退出交互模式(释放资源)
exit
2. 批处理作业(后台运行,适合长时间任务)
-
创建作业脚本(如
job.sh):cat > job.sh << EOF
#!/bin/bash
#SBATCH -J test-job # 作业名称
#SBATCH -n 2 # 总进程数
#SBATCH -c 1 # 每个进程占用的CPU核心数
#SBATCH --mem=2G # 作业总内存
#SBATCH -o job.out # 标准输出日志
#SBATCH -e job.err # 标准错误日志
#SBATCH -p debug # 指定分区(与slurm.conf中一致)作业执行内容(示例:查看节点信息、运行sleep命令)
echo "Job start time: (date)" echo "Running on node: (hostname)"
srun hostname # 每个进程输出所在节点
sleep 60 # 模拟任务运行
echo "Job end time: $(date)"
EOF
2.提交作业:
sbatch job.sh
# 输出示例:Submitted batch job 1(作业ID为1)
(二)作业管理常用命令
# 查看作业队列(所有用户作业)
squeue
# 查看指定用户作业(如用户root)
squeue -u root
# 取消作业(替换1为作业ID)
scancel 1
# 查看作业详情(替换1为作业ID)
scontrol show job 1
# 查看作业输出日志
cat job.out
cat job.err
# 查看集群资源使用情况
sstat -j 1 # 查看运行中作业的资源使用
seff 1 # 查看已完成作业的资源利用率
四、进阶配置(可选,生产环境必备)
(一)启用会计功能(记录作业历史,支持配额管理)
-
控制节点安装并配置 MariaDB:
启动MariaDB服务
systemctl start mariadb && systemctl enable mariadb
初始化数据库(设置root密码、移除匿名用户等)
mysql_secure_installation
登录数据库,创建Slurm账号和数据库
mysql -u root -p
CREATE DATABASE slurm_acct_db;
CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'SlurmDB@123'; # 自定义密码
GRANT ALL PRIVILEGES ON slurm_acct_db.* TO 'slurm'@'localhost';
FLUSH PRIVILEGES;
exit
2.编译安装 Slurm 数据库插件(控制节点执行):
cd /opt/slurm-23.11.8
./configure --prefix=/usr/local/slurm --with-mysql=/usr
make -j 4 && make install
3.初始化会计数据库并修改 Slurm 配置:
# 初始化数据库
/usr/local/slurm/bin/sacctmgr initdb
# 修改 slurm.conf 启用会计
sed -i 's/AccountingStorageType=accounting_storage\/none/AccountingStorageType=accounting_storage\/mysql/' /etc/slurm/slurm.conf
echo 'AccountingStorageHost=localhost' >> /etc/slurm/slurm.conf
echo 'AccountingStorageUser=slurm' >> /etc/slurm/slurm.conf
echo 'AccountingStoragePass=SlurmDB@123' >> /etc/slurm/slurm.conf # 与数据库密码一致
# 重启 Slurm 控制服务
systemctl restart slurmctld
4.验证会计功能
# 查看作业历史(提交过的作业会被记录)
sacct
(二)GPU 资源调度配置(若集群含 GPU)
-
所有节点安装 NVIDIA 驱动和 CUDA(略,参考 NVIDIA 官方文档)。
-
修改
slurm.conf添加 GPU 资源配置:在 NodeName 行添加 Gres=gpu:数量(如2块GPU)
NodeName=slurm-node1 CPU=4 RealMemory=8192 Gres=gpu:2 State=UNKNOWN
NodeName=slurm-node2 CPU=4 RealMemory=8192 Gres=gpu:2 State=UNKNOWN添加 Gres 配置项
GresTypes=gpu
3.提交 GPU 作业示例
sbatch --gres=gpu:1 job.sh # 申请1块GPU
五、常见问题排查
1. 节点状态显示 DOWN/UNKNOWN
- 检查 Munge 服务是否正常:
systemctl status munge(所有节点必须运行)。 - 检查节点间网络连通性:
ssh slurm-node1(控制节点能免密登录计算节点)。 - 查看 Slurm 日志:
cat /var/log/slurm/slurmctld.log(控制节点)、cat /var/log/slurm/slurmd.log(计算节点),定位报错(如配置文件语法错误、资源参数不匹配)。
2. 作业提交失败(提示资源不足)
- 检查节点状态:
sinfo(确保节点为 IDLE 状态)。 - 检查作业资源请求是否超过节点配置:
scontrol show nodes(对比 CPU / 内存参数)。 - 查看队列拥堵情况:
squeue(是否有大量作业占用资源)。
3. Munge 认证失败(日志显示 munge: authentication failed)
- 确保所有节点的
/etc/munge/munge.key完全一致(重新复制密钥并重启 Munge)。 - 检查密钥权限:
ls -l /etc/munge/munge.key(必须为 400,属主 munge:munge)。
六、运维建议(生产环境)
-
日志管理:定期归档 Slurm 日志(
/var/log/slurm),避免磁盘占满。 -
高可用:控制节点配置主备(Slurm HA),避免单点故障。
-
资源监控:结合 Prometheus + Grafana 监控 Slurm 集群资源使用情况。
-
权限管控:通过
sacctmgr管理用户、账户和资源配额,避免资源滥用。 -
版本更新:定期升级 Slurm 到最新 LTS 版本(修复漏洞,优化性能)。
总结
Slurm 部署核心是 Munge 认证一致性 和 slurm.conf 配置正确性,关键步骤为:环境准备→Munge 配置→Slurm 编译安装→集群配置→服务启动→作业测试。单节点部署可快速验证功能,多节点集群需重点保障节点间网络连通性和配置同步。通过
sinfo(节点状态)、squeue(作业队列)、sbatch(作业提交)三个核心命令,可完成日常集群管理。生产环境建议启用会计功能和 GPU 调度(如需),并配置监控与高可用。