Rocky Linux9安装Slurm

Rocky Linux9安装Slurm

基于Rocky Linux9安装Slurm系统,所有的安装都是基于root用户进行的,因此使用此教程的时候请确保你的root权限,安装默认机器是全新安装系统的服务器,对基础环境的配置也会同步进行。Rocky Linux9可以用yum和dnf两种方式来安装软件,目前来看这二者没有什么差异,因此我在安装过程中还是以yum为主。

1. 基础环境配置与软件安装

这一章所有小节的内容是需要在所有节点上进行的,在这一章之后的所有内容则是需要甄别控制节点与计算节点进行单独的操作的。

配置基础环境

新安装的主机它的主机名会默认为localhost,为了便于在通过ssh连接多节点的时候区别,最好为每个机器分配一个单独的主机名,这样在后续多个节点之间切换的时候避免出错。

1
hostnamectl set-hostname master 修改主机名

安装slurm任务管理系统是需要调用多个软件来协同处理的,因此需要配置一下EPEL源来确保所有需要安装的软件都能够正常安装,首先要配置一下镜像源,可以将原来的镜像源改为阿里云的,参考阿里云官网给出的教程:

rockylinux镜像_rockylinux下载地址_rockylinux安装教程-阿里巴巴开源镜像站 (aliyun.com)

1
2
3
4
5
6
7
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky-*.repo

dnf makecache
配置镜像源-阿里云

然后是安装EPEL源,但是不知道为何,简单的安装epel会在后续的安装的时候出现某些包找不到的情况,因此需要提前设置一下crb,配置步骤如下:

1
2
3
dnf config-manager --set-enabled crb
dnf install epel-release -y
添加EPEL源

配置好源之后就可以进行各种基础环境的安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 更新一下
dnf update -y
# 配置基本的环境,安装Development Tools包
yum groupinstall -y 'Development Tools'
# 这两个内容主要是为了后续安装其它软件做准备,但是安装了并不会有啥坏处
yum install -y perl
yum install -y gfortran

# 安装slurm所需要的各种依赖
yum install openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel man2html libibmad libibumad -y

yum install python3-pip perl-ExtUtils-MakeMaker gcc rpm-build mysql-devel json-c json-c-devel http-parser http-parser-devel automake autoconf -y
配置基础的编译环境

关于时间同步的问题

在CentOS7安装的时候普遍需要安装NTP时间同步服务,以避免遇到时间同步问题,但是Rocky自带的Chrony就内置了NTP时间同步服务,所以理论上来说这一步无需操作,不过可以检查一下chronyd.service是否正常。而且如果计算节点也是联网的,那么理论上来说也不需要额外的操作,但是如果计算节点在后续不打算连接外网,这里可以设置一下将计算节点的同步服务器地址来源于控制节点

1
2
3
4
5
yum -y install chrony

systemctl enable chronyd.service
systemctl restart chronyd.service
systemctl status chronyd.service 安装时间同步服务器(chrony)

安装NFS

计算节点与控制节点的通信还涉及到文件的传递,因此需要安装NFS以便于计算节点挂载控制节点的目录

1
2
yum -y install nfs-utils rpcbind
安装文件同步服务

配置munge和slurm用户

slurm配置设置到Munge的认证服务,这需要munge和slurm用户的GID和UID在多个节点之间保持一致,而在你安装这两个软件的时候,系统会自动为你创建对应的用户,但是这样就无法保证GID和UID一致了,所以这里提前创建这两个用户,并分别给他们设置为1108和1109的id,这样在后续安装的时候就会自动应用这个用户从而保证了id的一致性

1
2
3
4
5
6
groupadd -g 1108 munge
useradd -m -c "Munge Uid 'N' Gid Emporium" -d /var/lib/munge -u 1108 -g munge -s /sbin/nologin munge

groupadd -g 1109 slurm
useradd -m -c "Slurm manager" -d /var/lib/slurm -u 1109 -g slurm -s /bin/bash slurm
配置Munge用户和Slurm

为配置munge安装并配置rng-tool

1
2
3
4
5
yum install -y rng-tools

# 使用/dev/urandom来做熵源
rngd -r /dev/urandom
安装rng-tool配置熵源
1
2
3
4
5
6
vi /usr/lib/systemd/system/rngd.service

#################修改以下内容#####################
[service]
ExecStart=/sbin/rngd -f -r /dev/urandom $RNGD_ARGS
修改rngd配置文件
1
2
3
4
5
6
systemctl status rngd  # 查看状态

systemctl daemon-reload
systemctl start rngd
systemctl enable rngd
查看并重启rngd

安装munge和slurm

如果前面的基础环境配置没问题,Munge的安装可以直接用yum指令安装:

1
2
yum install munge munge-libs munge-devel -y
安装Munge

slurm的安装也有多种方式,但是其它的安装方式我都遇到了不少问题,这里介绍一个我成功的安装,也是很简单的方式,首先到官网上下载rpm包:

Download Slurm - SchedMD

我们先下载的是slurm-24.05.0.tar.bz2,然后将它上传到服务器上,登陆服务器并进入保存有该文件的目录下,然后执行以下指令:

1
2
rpmbuild -ta slurm-24.05.0.tar.bz2
rpm编译slurm安装包

理论上来说前面的基础环境配置没问题的话这里是不会报错的,如果出现报错的话就根据报错提醒的缺少依赖项安装一下即可。然后进入编译好的目录下安装:

1
2
3
cd /root/rpmbuild/RPMS/x86_64/
yum localinstall slurm-* -y
安装slurm

这样很快就可以完成slurm的安装。

2. 配置SSH免密登录以及挂载NFS

ssh免密登录

为了便于控制节点登录计算节点,可以配置免密登录,登录计算节点创建公钥秘钥对:

1
ssh-keygen 创建ssh密钥

然后会让你进行一系列的设置,直接保持默认不断enter即可,把文件保存到默认的目录下,然后将公钥复制到计算节点中:

1
2
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] 通过ssh将公钥发送给计算节点

root@后面就是计算节点的ip地址,后面需要输入一次yes以及计算节点的登录密码,配置成功之后即可以通过控制节点免密登录这两个计算节点,然后就可以用以下的方式登录:

1
2
ssh [email protected]
ssh [email protected]

NFS配置以挂载控制节点目录

首先在控制节点以及计算节点上面均创建一个相同名字的目录,以/software为例:

1
mkdir /software 创建目录

理论上来说名字不同也是可以的,但是为例避免后续不好记忆,我们这里就创建同名的目录,然后在控制节点上的etc目录下的exports文件中添加共享文件的设定内容,可以用以下指令完成

1
echo "/software/ *(rw,async,insecure,no_root_squash)" > /etc/exports 将要添加的内容输入进exports文件

然后要配置防火墙,rocky linux自带的防火墙为firewalld,放行以下服务:

1
2
3
4
5
6
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=nfs3
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
firewalld放行对应的服务

在控制节点中要启动nfs-server的服务,并设置开机自启动:

1
2
3
4
5
systemctl start nfs-server
systemctl start rpcbind
systemctl enable nfs-server
systemctl enable rpcbind
启动nfs和rpcbind

然后切换到计算节点,首先也要创建/software,然后也要设置一下firewalld:

1
2
3
4
5
6
7
8
mkdir /software

firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=nfs3
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload

也要启动一下相关的服务,这里的nfs-utils服务实测也可以不启动,依然可以成功挂载:

1
2
3
4
systemctl start nfs-utils
systemctl start rpcbind
systemctl enable nfs-utils
systemctl enable rpcbind

设置完成之后就可以挂载了,如下,其中的ipv4地址为控制节点在内网中的ip地址,其含义为将该ipv4地址下的software挂载到当前计算机中的/software目录下

1
mount -t nfs 192.168.174.201:/software /software

挂载成功之后就可以通过df -h查看具体信息。

3. 配置Munge

创建密钥并共享

在上一节中我们已经安装好了Munge,现在对其进行配置,首先在控制节点上创建一个全局密钥,用以下的代码来创建:

1
2
3
/usr/sbin/create-munge-key -r
dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
创建munge全局密钥

然后将该密钥同步到所有的计算节点,可以通过scp的方式来传递文件:

1
2
scp -p /etc/munge/munge.key [email protected]:/etc/munge
同步密钥

这里的ipv4地址就是计算节点在内网中的ip地址,然后登录到计算节点中,为刚刚传输过来的文件添加munge的权限:

1
2
chown munge: /etc/munge/munge.key
chmod 400 /etc/munge/munge.key 赋予munge用户密钥权限

启动Munge并验证解码

依次在控制节点和计算节点上启动并设置开机自启动munge服务:

1
2
3
4
5
systemctl start munge
systemctl enable munge

systemctl status munge
启动munge

启动之后可以在控制节点上验证一下munge是否能够正常运行,用以下指令分别验证本地和远程:

1
2
3
4
5
# 本地解码
munge -n | unmunge

# 验证计算节点,远程解码
munge -n | ssh 192.168.174.211 unmunge 测试munge

4. 配置Slurm

在前面已经安装好了slurm,这里就需要对slurm的配置文件进行修改。这里只用修改控制节点的配置文件即可,修改完之后将其上传到各个计算节点即可。切换到存放slurm配置文件的目录下:

1
2
3
4
cd /etc/slurm

cp cgroup.conf.example cgroup.conf
cp slurm.conf.example slurm.conf

slurm.conf的配置

然后使用文本编辑器打开slurm.conf文件,修改一下,我这里的内容如下,我这里用的ip地址与前文不一样,是因为我前后写这个博客花费了一些时间,所以ip在钻研的过程中有所变化,而且节点数量也有变化,所以我给出的是我最终用的信息,参考即可,ip地址根据自己的实际情况进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ClusterName=cluster
#SlurmctldHost=master
ControlMachine=master
ControlAddr=192.168.111.1
#
#MailProg=/bin/mail
#MpiDefault=
#MpiParams=ports=#-#
ProctrackType=proctrack/linuxproc
ReturnToService=1
SlurmctldPidFile=/var/run/slurm/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurm/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurm/slurmctld
#SwitchType=
TaskPlugin=task/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
#AccountingStorageType=
#JobAcctGatherFrequency=30
#JobAcctGatherType=
#SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
#SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
#
#
# COMPUTE NODES
NodeName=master NodeAddr=192.168.111.1 CPUs=64 RealMemory=52000 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN
NodeName=eglcpu[1-3] NodeAddr=192.168.111.[61-63] CPUs=192 RealMemory=500000 Sockets=2 CoresPerSocket=48 ThreadsPerCore=2 State=UNKNOWN
NodeName=eglgpu[1-3] NodeAddr=192.168.111.[21-23] CPUs=32 RealMemory=26000 Sockets=1 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN
NodeName=test NodeAddr=192.168.111.100 CPUs=32 RealMemory=26000 Sockets=1 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN

# NodeName=eglgpu[2-3] NodeAddr=192.168.111.[22-23] CPUs=32 RealMemory=26000 Sockets=1 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN
PartitionName=master Nodes=master Default=NO MaxTime=INFINITE State=UP
PartitionName=gpu Nodes=eglgpu[1-3] Default=YES MaxTime=INFINITE State=UP
PartitionName=cpu Nodes=eglcpu[1-3] Default=YES MaxTime=INFINITE State=UP
PartitionName=test Nodes=test Default=YES MaxTime=INFINITE State=UP


slurm.conf文件的编写主要有以下几个点要注意:

  1. 各个文件的存储路径设置,注意,这里的存储路径它默认给了一个,但是我的建议是修改一下,都单独创建一个文件夹给它用,因为我们最后是要给slurm分配用户权限它才能用这个目录的,不然就会报错,所以我将slurm.conf中所有有关的路径都单独添加了一个slurm目录。
  2. 各个节点的参数配置要合理,最好根据自己的配置单来设置,设置不正确也会报错
  3. 集群名称可以随意,ControlMachine则需要在NodeName里面指定才行。
  4. 此外官网也给出了一个帮你写slurm.conf的网站,可以参考:Slurm System Configuration Tool (schedmd.com)

cgroup.conf的配置

cgroup.conf文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
###
#
# Slurm cgroup support configuration file
#
# See man slurm.conf and man cgroup.conf for further
# information on cgroup configuration parameters
#--
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes

CgroupPlugin=cgroup/v1


就是在最后一行添加了CgroupPlugin=cgroup/v1。

启动slurm之前的其它准备

编辑完成两个配置文件之后,需要做一系列的操作来完成最后的准备,首先就是需要将参数文件传递给各个节点:

1
2
3
scp /etc/slurm/cgroup.conf 192.168.111.21:/etc/slurm
scp /etc/slurm/slurm.conf 192.168.111.21:/etc/slurm

所有节点都传递完成之后,再对所有节点进行防火墙放行,slurm运行的时候会用到6817-6819三个端口进行节点之间的信息往来,所以对于firewall,用一些指令进行防火墙放行:

1
2
3
4
firewall-cmd --permanent --add-port=6817-6819/tcp
firewall-cmd --reload

firewall-cmd --list-all 放行防火墙

最后就是提前为slurm创建各个目录,创建完成后还要为slurm添加权限,在各个节点执行以下指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir /var/spool/slurm/
mkdir /var/spool/slurm/slurmd
mkdir /var/spool/slurm/slurmctld
mkdir /var/log/slurm/
mkdir /var/run/slurm/


chown slurm: /var/spool/slurm/slurmd
chown slurm: /var/spool/slurm/slurmctld
chown slurm: /var/log/slurm/
chown slurm: /var/run/slurm/


经过上述步骤,所有的准备工作就完成了

启动slurm

经过所有的准备工作,就可以依次启动slurm系统了,slurm有多种服务,slurmd是基本的服务,slurmctld则是控制服务,还有个slurmdbd则是数据库服务,那个可以后续再添加。

要先启动各个计算节点的slurmd服务,然后再启动控制节点的slurmd服务以及slurmctld服务,启动对应服务的指令如下:

1
2
3
4
5
6
7
8
9
10
# 启动并设置自启动slurmd,并查看启动之后的状态
systemctl start slurmd
systemctl enable slurmd
systemctl status slurmd

# 启动并设置自启动slurmctld,并查看启动之后的状态
systemctl start slurmctld
systemctl enable slurmctld
systemctl status slurmctld

维护slurm的一些指令

1
2
3
4
5
6
7
8
# 更新配置文件
scontrol reconfigure
# 更新某个节点的状态,适用于某个节点因为重启或其他原因导致没有连接上控制节点
scontrol update nodename=egl_test state=RESUME

# 查看某个节点的详细信息
sinfo -N -l -n egl_test

5. 有关Slurmdbd

Slurmdbd的配置应该也不算麻烦,但是我看这个服务其实更算一个附加服务,目前我觉得对于小集群来说没必要配置这个服务,我看了一下要配置这个服务首先要重新配置MySQL,这个触及到了学艺不精的地方了,如果以后有需求的话我就再尝试配置吧。


Rocky Linux9安装Slurm
http://phoenixjason.cn/2024/10/28/20241028Rocky Linux9安装Slurm/
作者
Jason
发布于
2024年10月28日
许可协议