本次构建为生产级轻量 Slurm 集群,采用CentOS 7/8/Rocky Linux 8(主流企业级发行版,兼容性最好),节点分工为:1 台控制节点 + N 台计算节点 + 1 台登录节点 + 1 台存储节点,实现资源调度、用户接入、数据共享、作业执行全流程,所有操作均为可执行命令,适配 x86_64 架构,GPU/CPU 节点通用。

核心架构说明

节点类型 节点名 核心作用 关键组件 硬件建议
控制节点 slurm-master 集群调度核心、节点管理、作业控制 slurmctld、slurmdbd、mysql 4 核 8G 以上,稳定优先
登录节点 slurm-login 用户接入、作业提交 / 查询、编译 slurm 客户端、Lmod、编译器 4 核 16G 以上,多用户共享
计算节点 slurm-com01~N 作业执行、计算资源承载 slurmd、nvidia-docker(GPU) 按需配置(CPU/GPU/ 大内存)
存储节点 slurm-storage 集群共享存储、数据持久化 NFS 服务、大容量硬盘 多核 16G+TB 级 SSD/HDD,RAID5

前置统一要求(所有节点执行)

  1. 关闭防火墙 & SELinux(集群内部简化,生产可按需配置规则)

    # 关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld
    # 关闭SELinux
    sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    setenforce 0
  2. 配置主机名与 hosts 解析(必须保证所有节点互相解析)

    # 各节点分别执行(替换为对应节点名/IP)
    # 控制节点:hostnamectl set-hostname slurm-master
    # 登录节点:hostnamectl set-hostname slurm-login
    # 计算节点:hostnamectl set-hostname slurm-com01(依次类推)
    # 存储节点:hostnamectl set-hostname slurm-storage
    ​
    # 所有节点添加hosts(替换为实际IP)
    cat >> /etc/hosts << EOF
    192.168.1.100 slurm-master  # 控制节点IP
    192.168.1.101 slurm-login   # 登录节点IP
    192.168.1.102 slurm-storage # 存储节点IP
    192.168.1.201 slurm-com01   # 计算节点1
    192.168.1.202 slurm-com02   # 计算节点2(按需添加)
    EOF
  3. 配置免密登录(控制节点→所有节点,登录节点→所有计算节点)

    # 控制节点生成密钥并分发(登录节点执行相同操作)
    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    ssh-copy-id root@slurm-login
    ssh-copy-id root@slurm-storage
    ssh-copy-id root@slurm-com01
    ssh-copy-id root@slurm-com02
  4. 安装基础依赖 & 同步时间(所有节点)

    yum install -y wget ntpdate net-tools vim gcc gcc-c++ make libssh2-devel
    ntpdate ntp.aliyun.com && hwclock -w
    echo "*/10 * * * * ntpdate ntp.aliyun.com > /dev/null 2>&1" | crontab -
  5. 禁用 Swap(提升性能,Slurm 推荐)

    swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

第一步:存储节点(slurm-storage)搭建 NFS 共享存储

        集群所有节点共用一份存储,实现数据互通(作业脚本、输入输出、软件环境均存放在共享存储),这是集群的基础。

1. 安装 NFS 服务

yum install -y nfs-utils rpcbind

2. 创建共享目录并配置权限

# 创建共享目录(按需规划,如作业目录、软件目录、用户目录)
mkdir -p /nfs/slurm/{jobs,soft,home}
# 赋予所有节点访问权限(192.168.1.0/24为集群网段,按需修改)
chmod -R 777 /nfs/slurm
cat >> /etc/exports << EOF
/nfs/slurm 192.168.1.0/24(rw,sync,no_root_squash,no_all_squash)
EOF

3. 启动 NFS 服务并设置开机自启

systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs-server && systemctl enable nfs-server
# 生效配置
exportfs -rv

4. 验证 NFS 服务

showmount -e localhost
# 输出如下即正常:Export list for localhost: /nfs/slurm 192.168.1.0/24

第二步:控制节点(slurm-master)搭建(集群核心)

        控制节点是 Slurm 的大脑,部署slurmctld(调度服务)、slurmdbd(记账服务)、MySQL(记账数据库),同时挂载 NFS 共享存储,并生成 Slurm 集群配置文件(所有节点共用)。

阶段 1:挂载 NFS 共享存储(永久挂载,所有节点均需执行)

# 所有节点执行(控制/登录/计算),先安装nfs-utils
yum install -y nfs-utils
# 创建挂载目录
mkdir -p /nfs/slurm
# 配置永久挂载(重启不丢失)
echo "slurm-storage:/nfs/slurm /nfs/slurm nfs defaults 0 0" >> /etc/fstab
# 立即挂载
mount -a
# 验证挂载:df -h 看到/nfs/slurm即正常

阶段 2:安装 MySQL 数据库(slurmdbd 依赖)

# 安装mariadb(CentOS自带,兼容MySQL)
yum install -y mariadb-server mariadb
# 启动并开机自启
systemctl start mariadb && systemctl enable mariadb
# 初始化数据库(按提示操作,设置root密码,如slurm@123456)
mysql_secure_installation
# 登录数据库,创建slurm账户和数据库
mysql -uroot -p
# 执行SQL语句(替换密码为实际密码,如slurm@123456)
CREATE DATABASE slurm_acct_db;
CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'slurm@123456';
CREATE USER 'slurm'@'%' IDENTIFIED BY 'slurm@123456';
GRANT ALL PRIVILEGES ON slurm_acct_db.* TO 'slurm'@'localhost';
GRANT ALL PRIVILEGES ON slurm_acct_db.* TO 'slurm'@'%';
FLUSH PRIVILEGES;
EXIT;

阶段 3:安装 Slurm 软件(所有节点统一版本,控制节点编译后分发)

        Slurm 建议源码编译(版本最新、兼容性最好),这里选择slurm-23.11.5(LTS 长期支持版)。

下载链接:https://download.schedmd.com/slurm/

# 安装编译依赖
yum install -y wget tar gcc gcc-c++ make munge munge-devel libuuid-devel \
readline-devel ncurses-devel perl-ExtUtils-MakeMaker mysql-community-devel \
openssl-devel hwloc-devel numactl-devel
# 下载源码包
cd /usr/local/src
wget https://download.schedmd.com/slurm/slurm-23.11.5.tar.bz2
tar -jxf slurm-23.11.5.tar.bz2 && cd slurm-23.11.5
# 配置编译参数(指定MySQL路径,替换数据库密码)
./configure --prefix=/usr/local/slurm \
--with-mysql-config=/usr/bin/mysql_config \
--with-slurmdbd-user=slurm \
--with-slurmdbd-group=slurm
# 编译并安装(-j后接CPU核数,加速编译)
make -j4 && make install

阶段 4:配置 Munge 认证(Slurm 节点间通信加密,所有节点必须一致)

        Munge 是 Slurm 的核心认证组件,所有节点的munge.key必须完全相同,由控制节点生成并分发

# 1. 控制节点创建munge用户和组
groupadd -r munge
useradd -r -g munge -d /var/lib/munge -s /sbin/nologin munge
# 2. 生成munge.key
yum install -y munge
dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
chown munge:munge /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
# 3. 启动munge并开机自启
systemctl start munge && systemctl enable munge
# 4. 分发munge.key到所有节点(控制节点执行,免密已配置)
scp /etc/munge/munge.key root@slurm-login:/etc/munge/
scp /etc/munge/munge.key root@slurm-storage:/etc/munge/
scp /etc/munge/munge.key root@slurm-com01:/etc/munge/
scp /etc/munge/munge.key root@slurm-com02:/etc/munge/
# 5. 所有节点执行(设置权限+启动munge)
# 登录其他节点执行:
groupadd -r munge
useradd -r -g munge -d /var/lib/munge -s /sbin/nologin munge
chown munge:munge /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
yum install -y munge
systemctl start munge && systemctl enable munge
# 验证munge:所有节点执行 munge -n | unmunge ,无报错即正常

阶段 5:创建 Slurm 用户和组(所有节点执行)

groupadd -r slurm
useradd -r -g slurm -d /var/lib/slurm -s /sbin/nologin slurm
# 创建Slurm日志和运行目录
mkdir -p /var/log/slurm /var/run/slurm
chown -R slurm:slurm /var/log/slurm /var/run/slurm
chmod -R 755 /var/log/slurm /var/run/slurm

阶段 6:生成 Slurm 核心配置文件(最关键,控制节点编写后分发)

        Slurm 所有配置文件统一放在/usr/local/slurm/etc/,核心文件为slurm.conf(主配置)、slurmdbd.conf(记账配置)、cgroup.conf(资源限制),配置文件所有节点必须完全一致

1. 编写 slurmdbd.conf(记账服务配置,控制节点)
cat > /usr/local/slurm/etc/slurmdbd.conf << EOF
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
DbdHost=slurm-master
DbdPort=6819
SlurmUser=slurm
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurm/slurmdbd.pid
StorageType=accounting_storage/mysql
StorageHost=localhost
StorageUser=slurm
StoragePass=slurm@123456  # 与MySQL中slurm用户密码一致
StorageDatabase=slurm_acct_db
EOF
chown slurm:slurm /usr/local/slurm/etc/slurmdbd.conf
chmod 600 /usr/local/slurm/etc/slurmdbd.conf
2. 编写 slurm.conf(主配置,核心!按实际集群修改)

        重点修改NodeName(计算节点名 + 资源)、PartitionName(分区配置)、ClusterName(集群名),以下为2 台计算节点示例(CPU 节点,GPU 节点需额外配置Gres.conf)。

cat > /usr/local/slurm/etc/slurm.conf << EOF
# 集群基础配置
ClusterName=slurm-cluster
SlurmctldHost=slurm-master
SlurmdbdHost=slurm-master
AuthType=auth/munge
StateSaveLocation=/var/run/slurm
SlurmdSpoolDir=/var/run/slurm/slurmd
LogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log
PidFile=/var/run/slurm/slurmctld.pid
SlurmdPidFile=/var/run/slurm/slurmd.pid
# 通信配置
SlurmctldPort=6817
SlurmdPort=6818
MpiDefault=none
ProctrackType=proctrack/cgroup
ReturnToService=1
# 资源调度配置
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core_Memory
# 计算节点配置(NodeName=节点名 CPUs=核数 MemPerCPU=每核内存M 节点地址)
NodeName=slurm-com01 CPUs=32 MemPerCPU=8192 State=UNKNOWN NodeAddr=192.168.1.201
NodeName=slurm-com02 CPUs=32 MemPerCPU=8192 State=UNKNOWN NodeAddr=192.168.1.202
# 分区配置(PartitionName=分区名 Nodes=所属节点 Default=YES 默认分区 MaxTime=作业最大运行时间)
PartitionName=cpu-part Nodes=slurm-com[01-02] Default=YES MaxTime=INFINITE State=UP
# 记账配置
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=slurm-master
AccountingStoreJobComment=YES
JobAcctGatherType=jobacct_gather/cgroup
JobAcctGatherFrequency=30
EOF
3. 编写 cgroup.conf(资源限制配置,防止作业占满节点)
cat > /usr/local/slurm/etc/cgroup.conf << EOF
CgroupPlugin=cgroup/v2
CgroupAutomount=yes
ConstrainCores=yes
ConstrainMemory=yes
ConstrainDevices=yes
AllowedDevices=/dev/null,/dev/zero,/dev/random,/dev/urandom,/dev/tty,/dev/pts,/dev/sysfs,/dev/proc,/dev/fuse
EOF
4. 分发 Slurm 配置文件到所有节点(控制节点执行)
# 先把编译好的Slurm程序分发到所有节点(控制节点执行)
scp -r /usr/local/slurm root@slurm-login:/usr/local/
scp -r /usr/local/slurm root@slurm-com01:/usr/local/
scp -r /usr/local/slurm root@slurm-com02:/usr/local/
# 分发配置文件
scp /usr/local/slurm/etc/* root@slurm-login:/usr/local/slurm/etc/
scp /usr/local/slurm/etc/* root@slurm-com01:/usr/local/slurm/etc/
scp /usr/local/slurm/etc/* root@slurm-com02:/usr/local/slurm/etc/
# 所有节点设置Slurm环境变量(永久生效)
cat >> /etc/profile << EOF
export PATH=/usr/local/slurm/bin:/usr/local/slurm/sbin:\$PATH
export LD_LIBRARY_PATH=/usr/local/slurm/lib64:\$LD_LIBRARY_PATH
EOF
source /etc/profile

阶段 7:启动控制节点 Slurm 服务并设置开机自启

# 1. 启动slurmdbd(记账服务,先启动)
systemctl start slurmdbd && systemctl enable slurmdbd
# 2. 启动slurmctld(调度服务,核心)
systemctl start slurmctld && systemctl enable slurmctld
# 3. 创建systemd服务文件(所有节点需创建,控制节点创建后分发)
# 控制节点创建slurmdbd.service
cat > /usr/lib/systemd/system/slurmdbd.service << EOF
[Unit]
Description=Slurm Database Daemon
After=network.target mariadb.service munge.service
Requires=mariadb.service munge.service
​
[Service]
Type=forking
ExecStart=/usr/local/slurm/sbin/slurmdbd
ExecReload=/bin/kill -HUP \$MAINPID
PIDFile=/var/run/slurm/slurmdbd.pid
Restart=on-failure
User=slurm
Group=slurm
​
[Install]
WantedBy=multi-user.target
EOF
​
# 控制节点创建slurmctld.service
cat > /usr/lib/systemd/system/slurmctld.service << EOF
[Unit]
Description=Slurm Controller Daemon
After=network.target munge.service slurmdbd.service
Requires=munge.service slurmdbd.service
​
[Service]
Type=forking
ExecStart=/usr/local/slurm/sbin/slurmctld
ExecReload=/bin/kill -HUP \$MAINPID
PIDFile=/var/run/slurm/slurmctld.pid
Restart=on-failure
User=slurm
Group=slurm
​
[Install]
WantedBy=multi-user.target
EOF
​
# 控制节点创建slurmd.service(计算节点用)
cat > /usr/lib/systemd/system/slurmd.service << EOF
[Unit]
Description=Slurm Node Daemon
After=network.target munge.service
Requires=munge.service
​
[Service]
Type=forking
ExecStart=/usr/local/slurm/sbin/slurmd
ExecReload=/bin/kill -HUP \$MAINPID
PIDFile=/var/run/slurm/slurmd.pid
Restart=on-failure
User=slurm
Group=slurm
​
[Install]
WantedBy=multi-user.target
EOF
​
# 分发service文件到所有节点
scp /usr/lib/systemd/system/slurm* root@slurm-login:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/slurm* root@slurm-com01:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/slurm* root@slurm-com02:/usr/lib/systemd/system/
# 所有节点重新加载systemd
systemctl daemon-reload

阶段 8:验证控制节点服务

# 查看slurmdbd状态
systemctl status slurmdbd
# 查看slurmctld状态
systemctl status slurmctld
# 查看Slurm版本
sinfo -V
# 无报错、版本正常即成功

第三步:计算节点(slurm-com01~N)搭建

        计算节点仅需启动slurmd 服务(执行作业),无需部署调度 / 记账服务,操作极简,所有计算节点执行相同命令

1. 确认前置条件(已完成)

  • 挂载 NFS 共享存储

  • 同步 hosts 解析和免密登录

  • 安装 munge 并同步 munge.key

  • 接收控制节点分发的 Slurm 程序和配置文件

  • 配置 Slurm 环境变量

  • 创建 slurm/munge 用户和目录

2. 启动 slurmd 服务并设置开机自启

systemctl start slurmd && systemctl enable slurmd
# 验证服务状态
systemctl status slurmd

3. GPU 计算节点额外配置(可选)

        若为 GPU 节点,需安装NVIDIA 驱动 + CUDA,并配置 Slurm 的Gres.conf(GPU 资源管理),控制节点编写后分发到所有节点:

# 控制节点编写Gres.conf
cat > /usr/local/slurm/etc/Gres.conf << EOF
NodeName=slurm-com01 Name=gpu Count=4  # 4块GPU
NodeName=slurm-com02 Name=gpu Count=2  # 2块GPU
EOF
# 分发到所有节点
scp /usr/local/slurm/etc/Gres.conf root@slurm-login:/usr/local/slurm/etc/
scp /usr/local/slurm/etc/Gres.conf root@slurm-com01:/usr/local/slurm/etc/
scp /usr/local/slurm/etc/Gres.conf root@slurm-com02:/usr/local/slurm/etc/
# 所有节点重启slurm服务
systemctl restart slurmctld (控制节点)
systemctl restart slurmd (所有计算节点)

第四步:登录节点(slurm-login)搭建

        登录节点为用户操作入口,无需启动 slurmctld/slurmdbd/slurmd 服务,仅需安装 Slurm 客户端,同时配置用户环境、编译器、软件库,提升用户体验。

1. 确认前置条件(已完成)

  • 挂载 NFS 共享存储

  • 接收控制节点分发的 Slurm 程序和配置文件

  • 配置 Slurm 环境变量

  • 同步 munge.key 并启动 munge 服务

2. 安装用户常用工具(编译器、包管理、环境管理)

# 安装编译器和开发工具
yum groupinstall -y "Development Tools"
yum install -y wget curl git zip unzip bzip2
# 安装Anaconda(统一Python环境,用户无需单独安装)
cd /usr/local/src
wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
bash Anaconda3-2023.09-0-Linux-x86_64.sh -b -p /usr/local/anaconda3
# 配置Anaconda环境变量(所有用户可用)
cat >> /etc/profile << EOF
export PATH=/usr/local/anaconda3/bin:\$PATH
EOF
source /etc/profile
# 安装Lmod(模块管理,切换不同软件版本)
yum install -y Lmod

3. 配置用户目录(映射到 NFS 共享存储,数据持久化)

# 新建集群用户(示例,如user01),家目录放在NFS
useradd -d /nfs/slurm/home/user01 user01
echo "user01:123456" | chpasswd
# 所有用户家目录均在NFS,实现节点间用户数据互通

4. 验证登录节点功能

# 登录节点执行,查看集群节点状态
sinfo
# 输出如下即成功(节点状态为IDLE,空闲)
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu-part*    up   infinite      2  IDLE slurm-com[01-02]

第五步:集群整体验证(核心操作,登录节点执行)

        所有节点搭建完成后,在登录节点执行以下命令,验证集群全功能是否正常,普通用户也可执行(如 user01)。

1. 查看集群节点状态

sinfo  # 查看节点和分区状态
scontrol show node  # 查看节点详细信息
scontrol show partition  # 查看分区详细信息

2. 提交交互式作业(测试计算节点执行)

# 申请1核1G内存,交互式终端
srun --cpus-per-task=1 --mem=1G --pty bash
# 进入计算节点后,执行hostname,会显示计算节点名(如slurm-com01)
# 执行exit退出交互式终端

3. 提交批处理作业(测试完整作业流程)

# 编写作业脚本(存放在NFS的jobs目录)
cat > /nfs/slurm/jobs/test_job.sh << EOF
#!/bin/bash
#SBATCH --job-name=test_job
#SBATCH --cpus-per-task=2
#SBATCH --mem=2G
#SBATCH --output=/nfs/slurm/jobs/test_job_%j.out
#SBATCH --error=/nfs/slurm/jobs/test_job_%j.err
​
# 作业内容
echo "Job start time: \$(date)"
echo "Job run on node: \$(hostname)"
echo "CPU cores: \$SLURM_CPUS_PER_TASK"
sleep 10
echo "Job end time: \$(date)"
EOF
​
# 赋予执行权限
chmod +x /nfs/slurm/jobs/test_job.sh
# 提交作业
sbatch /nfs/slurm/jobs/test_job.sh
# 查看作业状态
squeue -u \$USER
# 作业完成后,查看输出日志
cat /nfs/slurm/jobs/test_job_*.out

4. 查看作业历史和记账信息

sacct  # 查看作业历史
sacct -j 作业ID --format=JobID,JobName,Elapsed,CPUs,Mem,State  # 查看指定作业详情
sreport cluster utilization  # 查看集群资源利用率

第六步:集群日常维护与常用命令

1. 服务启停命令

# 控制节点
systemctl start/stop/restart slurmctld  # 调度服务
systemctl start/stop/restart slurmdbd   # 记账服务
# 计算节点
systemctl start/stop/restart slurmd     # 执行服务
# 所有节点
systemctl start/stop/restart munge      # 认证服务

2. 节点状态管理

scontrol update NodeName=slurm-com01 State=DOWN  # 标记节点为下线
scontrol update NodeName=slurm-com01 State=UP    # 标记节点为上线
scontrol reboot NodeName=slurm-com01             # 远程重启计算节点

3. 作业管理

squeue  # 查看所有作业
scancel 作业ID  # 取消指定作业
scancel -u 用户名  # 取消指定用户的所有作业
scontrol hold 作业ID  # 挂起作业
scontrol release 作业ID  # 释放作业

4. 日志查看(排错核心)

tail -f /var/log/slurm/slurmctld.log  # 控制节点调度日志
tail -f /var/log/slurm/slurmdbd.log   # 控制节点记账日志
tail -f /var/log/slurm/slurmd.log     # 计算节点执行日志

第七步:生产集群优化建议

  1. 高可用部署:控制节点部署双主(slurm-master01/slurm-master02),开启 Slurmctld 高可用,防止单节点故障;

  2. 多登录节点:部署 2 台以上登录节点,做负载均衡(如 Nginx/HAProxy),提升多用户并发体验;

  3. 存储优化:生产环境用Lustre/Ceph替代 NFS,支持更高吞吐和更大容量,适配海量作业数据;

  4. 监控告警:部署Prometheus+Grafana+slurm-exporter,监控集群节点状态、资源使用率、作业运行情况,配置邮件 / 钉钉告警;

  5. 用户权限:通过 Slurm 的Accounting功能配置用户 / 组资源配额(如最大作业数、最大 CPU/GPU 数),防止个别用户占用过多资源;

  6. GPU 优化:安装nvidia-slurm,实现 GPU 精细化调度(如指定 GPU 卡号、显存限制);

  7. 备份配置:定期备份 Slurm 配置文件(/usr/local/slurm/etc/)和 MySQL 记账数据库,防止配置丢失。

集群搭建成功标准

munge -n | unmunge
  1. 所有节点munge 认证正常(munge -n | unmunge 无报错);

  2. 控制节点slurmctld/slurmdbd 服务正常运行,计算节点slurmd 服务正常运行

  3. 登录节点执行sinfo能看到所有计算节点,状态为IDLE

  4. 能正常提交交互式 / 批处理作业,作业在计算节点执行,输出日志正常;

  5. sacct能查询到作业历史,记账功能正常。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐