Slurm双机安装与配置
使用Slurm将两台工作站组成小HPC
手里有两台工作站,尝试将其使用slurm组成小集群,其中一台机器A,配置较弱,将其作为控制节点,登录节点,轻量计算节点,机器B用作计算节点 (两台机器都是Ubuntu 22.04)
本文仅涉及Slurm安装以及最基础的使用,关于作业空间管理以及计费等功能本篇不涉及
安装前准备
1. 机器间用户一致
保持机器间UID >= 1000的用户UID,GID保持一致,也就是说保持自己创建的用户一致。
使用cat /etc/passwd 确认从1000开始的UID的用户名,GID,SHELL,在机器间保持一致,某个机器没有某个用户直接创建一个就行,但是保证一致
2. 节点间时钟同步
使用chrony保持不同机器间时钟同步
- 在两台机器上都安装chrony
sudo apt-get install chrony
# chrnoy安装后配置文件在/etc/chrony/
- 修改master的chrony配置
# 将原pool注释
# 例如
#pool ntp.ubuntu.com iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# 新添加服务器
pool cn.pool.ntp.org iburst
server ntp.ntsc.ac.cn iburst
# 此设置将master暴露在局域网中,注意ip地址和局域网保持一致
allow 192.168.1.0/24
- 修改其他节点的chrony配置
# 同样地将原pool注释掉
#pool ntp.ubuntu.com iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# 将server指定为master的ip地址,假定地址是192.168.1.1,根据实际情况而定
server 192.168.1.1 iburst minpoll 4 maxpoll 4
- 运行chrony并设置开机启动
sudo systemctl restart chronyd
sudo systemctl enable chronyd
# 验证同步状态
chronyc sources
# 如果chronyc sources验证成功,那么可以开始下一步操作
3. 节点间通信: munge
munge用于节点间通信, 本文选择源码编译安装munge
- 为munge创建用户: 用户名和组名都为munge
# 注意munge一定要小写,不然后面munge无法找到munge用户
sudo useradd -s /sbin/nologin -Uu 1001 munge
- 创建munge需要的目录,注意这些目录所有者都需要改成munge
mkdir -p /var/log/munge
mkdir -p /var/run/munge
mkdir -p /etc/munge
sudo chown munge:munge /var/log/munge
sudo chown munge:munge /var/run/munge
sudo chown munge:munge /etc/munge
- 编译安装
git clone https://github.com/dun/munge.git
cd munge
./bootstrap
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--runstatedir=/run
make
make check
sudo make install
- 生成密钥
注意密钥只能在master节点生成,生成后下发至其他机器,并且保证只有munge用户可读
sudo /usr/sbin/mungekey
# 密钥生成在/etc/munge/munge.key中
# 修改密钥所属和权限
sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key
# 下发密钥
sudo scp /etc/munge/munge.key 其他节点_USERNAME@Hostname:/etc/munge/
- 启动munge服务
# 启动并设置systemd
sudo systemctl enable munge
sudo systemctl start munge
安装Slurm
Slurm用户创建
slurm也需要一个单独的用户, 需要日志目录等
sudo useradd -s /sbin/nologin -Uu 1002 slurm
# 配置文件存放目录
sudo mkdir -p /etc/slurm/
# 存放 PID 文件和节点状态(State)文件
sudo mkdir -p /var/log/slurm
# Master/Slurmctld 专用 , 只有master节点需要该目录
sudo mkdir -p /var/spool/slurm/ctld
# Worker/Slurmd 专用,只有计算节点需要这个目录
sudo mkdir -p /var/spool/slurm/d
# 依旧改变归属
sudo chown -R slurm:slurm /var/log/slurm
sudo chown -R slurm:slurm /var/spool/slurm
Slurm本体安装
本文通过源码编译安装
# 依赖安装
apt-get install build-essential fakeroot devscripts equivs
# 下载
# slurm-25.11.1.tar.bz2
wget https://download.schedmd.com/slurm/slurm-25.11.1.tar.bz2
tar -axf slurm-25.11.1.tar.bz2
cd slurm-25.11.1
# 配置
./configure \
--prefix=/usr \ # 指定安装路径
--sysconfdir=/etc/slurm \ # 指定配置文件目录
--enable-debug \
--with-munge \
--enable-pam \
--with-shared-lib
# 编译,安装
# 二进制文件将安装到/usr/sbin
sudo make $(nproc)
sudo make install
# 将system服务复制到/etc/systemd/system/中
# 控制节点需要复制
sudo cp slurm-25.11.1/etc/slurmctld.service /etc/systemd/system/
# 本文中控制节点也是计算节点,所以还需要复制
sudo cp slurm-25.11.1/etc/slurmd.service /etc/systemd/system/
==============================================================
# 计算节点仅需要复制
sudo cp slurm-25.11.1/etc/slurmd.service /etc/systemd/system/
- master节点 slurm配置编写
本文示例仅写最基础的配置,保证其能运行即可
# 集群名字
ClusterName=your_HPC_name
# 创建的 slurm 专用用户,这里就是slurm
SlurmUser=slurm
# 重要!!!指定master的host名
SlurmctldHost=master_host
# 控制器端口
SlurmctldPort=6817
=======================================================================
# FILE PATHS AND LOGGING
# Slurmctld 状态文件位置 (仅 Master 节点需要)
StateSaveLocation=/var/spool/slurm/ctld
# Slurmd 状态文件位置 (Master 和 Worker 都需要)
SlurmdSpoolDir=/var/spool/slurm/d
=======================================================================
# 日志文件路径
# 仅master节点需要
SlurmctldLogFile=/var/log/slurm/slurmctld.log
# 仅计算节点需要
SlurmdLogFile=/var/log/slurm/slurmd.log
=======================================================================
# SECURITY AND AUTHENTICATION
# 启用 MUNGE 认证 (已确认工作正常)
AuthType=auth/munge
# ------------------------------------------------------------------
# NODE CONFIGURATION (定义所有物理节点)
# ------------------------------------------------------------------
# Master Node: Machine A
# 后面是填配置信息
NodeName=master_host Sockets=2 CoresPerSocket=12 ThreadsPerCore=2 RealMemory=61440 CoreSpecCount=8 State=UNKNOWN
# Worker Node: Machine B
NodeName=worker_host Sockets=2 CoresPerSocket=18 ThreadsPerCore=2 RealMemory=124668 State=UNKNOWN
# ------------------------------------------------------------------
# PARTITION CONFIGURATION (定义队列)
# ------------------------------------------------------------------
PartitionName=debug Nodes=master_host,worker_host Default=YES MaxTime=INFINITE State=UP
- 在master和计算节点分别完成安装以及配置文件填写后,直接在两个节点分别运行
======master节点========
sudo systemctl daemon-reload
sudo systemctl start slurmd
sudo systemctl start slurmctld
======worker节点========
sudo systemctl daemon-reload
sudo systemctl start slurmd
======测试======
# 查看所有节点是否为idle状态
sinfo
# 至此已经安装完成
特别注意
在slurm配置文件中SlurmctldHost=master_host表示master的host名,所以还需要在每台机器上定义host映射
sudo cat "192.168.1.1 master_host" >> /etc/hosts
sudo cat "192.168.1.100 worker_host" >> /etc/hosts
测试
至此slurm基本安装完成,可以完成最基本调用
写个简单的测试脚本
#!/bin/bash
#SBATCH --job-name=WorkerTest
#SBATCH --output=worker_test_output.txt
#SBATCH --error=worker_test_error.txt
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --time=00:01:00
# ----------------------------------------------------
# 测试不同节点
# ----------------------------------------------------
#SBATCH --nodelist=master_host 或者worker_host
# 打印主机名,确认作业确实在 kkmonster 上执行
echo "Hello! This job is running on node: $(hostname)"
# 打印一些环境变量
echo "SLURM_JOB_NODELIST: ${SLURM_JOB_NODELIST}"
echo "SLURM_JOB_ID: ${SLURM_JOB_ID}"
# 暂停 5 秒,以便您有时间在 squeue 中看到它
sleep 5