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


slurm 中文文档