SLURM调度系统教程
SLURM(Simple Linux Utility for Resource Management)是一个开源的、用于管理和调度高性能计算(HPC)集群资源的软件工具。它主要用于在大规模计算环境中分配和管理计算任务的资源,确保高性能计算集群的有效利用。SLURM被广泛用于科学研究、工程模拟、数据分析等需要大量计算资源的领域。
SLURM调度系统的主要功能和组件包括:
-
作业调度: SLURM负责调度和分配计算任务,即作业,到集群中的计算节点上。它通过一种灵活的分区(Partition)和队列(Queue)系统,根据作业的需求和系统的可用资源来合理分配计算资源。
-
资源管理: SLURM管理集群中的计算节点资源,包括处理器核心、内存、GPU等。通过资源管理,SLURM确保每个作业都得到足够的资源以顺利执行,同时避免资源冲突和浪费。
-
用户权限控制: SLURM支持对集群资源的精细权限控制,确保只有经过授权的用户能够提交和管理作业。这有助于维护集群的安全性和稳定性。
-
作业监控: SLURM提供作业监控和状态查询的功能,使用户能够随时了解自己作业的执行情况,包括作业是否在运行、已完成或出现错误等信息。
-
灵活的调度策略: SLURM允许管理员根据集群的特定需求配置灵活的调度策略,以适应不同类型的作业和工作负载。
Slurm采用slurmctld服务(守护进程)作为中心管理器用于监测资源和作业,为了提高可用性,还可以配置另一个备份冗余管理器。
各计算节点需启动slurmd守护进程,以便被用于作为远程shell使用:等待作业、执行作业、返回状态、再等待更多作业。slurmdbd(Slurm DataBase Daemon)数据库守护进程(非必需,建议采用,也可以记录到纯文本中等),可以将多个slurm管理的集群的记账信息记录在同一个数据库中。
还可以启用slurmrestd(Slurm REST API Daemon)服务(非必需),该服务可以通过REST API与Slurm进行交互,所有功能都对应的API。用户工具包含 srun
运行作业、 scancel
终止排队中或运行中的作业、 sinfo
查看系统状态、 squeue
查看作业状态、 sacct
查看运行中或结束了的作业及作业步信息等命令。 sview
命令可以图形化显示系统和作业状态(可含有网络拓扑)。 scontrol
作为管理工具,可以监控、修改集群的配置和状态信息等。用于管理数据库的命令是 sacctmgr
,可认证集群、有效用户、有效记账账户等。
slurm安装
slurm 的核心组件:
- slurmctld(Controller Daemon):
- slurmctld 是 SLURM 中的主控制守护程序,负责整个集群的管理和协调。它接受用户提交的作业请求,分配资源,进行作业调度,并监控计算节点的状态。
- slurmd(Compute Node Daemon):
- slurmd 是在每个计算节点上运行的守护程序,负责接收控制节点的指令并执行。它负责启动和停止作业、监测节点资源利用情况、报告节点状态等。
- slurmdbd(Database Daemon):
- slurmdbd 是一个可选的组件,用于将 SLURM 的状态和事件信息记录到数据库中,以便进行后续的查询和分析。数据库支持多种,如MySQL、PostgreSQL等。
- slurmctld和slurmd通信机制:
- slurmctld 和 slurmd 之间通过RPC(Remote Procedure Call)进行通信,用于传递控制信息、作业状态等。通信是通过 Slurm Communications Library(slurmctld、slurmd和其他组件之间的通信库)完成的。
- Slurm命令行工具:
- SLURM 提供了一系列命令行工具,用于用户提交作业、查询集群状态、监控作业执行等。常见的命令包括
sbatch
(提交作业)、squeue
(查询作业队列)、sinfo
(查询节点信息)等。
- SLURM 提供了一系列命令行工具,用于用户提交作业、查询集群状态、监控作业执行等。常见的命令包括
slurm 安装包:
Slurm的源代码可以从 https://www.schedmd.com/downloads.php 下载。 Index of /slurm (schedmd.com)
Slurm也已经被打包适用于Debian和Ubuntu(名为 slurm-wlm),Fedora,以及NetBSD(在pkgsrc中)和FreeBSD。
不过,通过系统的安装包安装的slurm版本一般都比较旧,建议可以通过源码安装。
slurm 安装依赖:
在安装SLURM时,有一些组件和依赖项是必须的,以确保SLURM正常运行。以下是一些常见的SLURM组件及其依赖项:
- slurmctld(Controller Daemon):
- 依赖于 slurmdbd(如果启用数据库支持)、MUNGE(用于安全通信)。
- 可能依赖于数据库(MySQL或MariaDB)作为 slurmdbd 的后端存储。
- slurmd(Compute Node Daemon):
- 依赖于 MUNGE(用于安全通信)。
- 可能依赖于其他节点间通信的网络组件。
- slurmdbd(Database Daemon):
- 依赖于数据库(MySQL或MariaDB)。
- MUNGE(身份验证服务):
- 可能依赖于系统库和安全库。
- 数据库(MySQL或MariaDB):
- MySQL或MariaDB服务器软件。
- 可能需要客户端库,以便slurmctld和slurmdbd能够与数据库通信。
- 其他可能的依赖项:
- Perl:某些SLURM组件可能需要Perl支持。
- Python:SLURM的一些脚本和工具可能需要Python支持。
- Lua:用于支持特定的功能,如Lua SPANK插件。
这里重点关注,两个依赖项:mysql和munge。
安装命令如下:
apt-get install make hwloc libhwloc-dev libmunge-dev libmunge2 munge mariadb-server libmysqlclient-dev -y
mysql 配置
Slurm支持将账户信息等记录到简单的纯文本文件中、或直接存入数据库(MySQL或MariaDB等)、或对于多集群的某个安全管理账户信息的服务。该文档采用将记账信息等存储到数据库方式。
MySQL 和 MariaDB 都是开源数据库技术。您可以使用它们以包含行和列的表格格式存储数据。MySQL 是最广泛采用的开源数据库。它是许多热门网站、应用程序和商业产品的主要关系数据库。MariaDB 是 MySQL 的修改版本。在 MySQL 被 Oracle 公司收购后,出于许可和分发方面的问题,MySQL 的原始开发团队制作了 MariaDB。自收购以来,MySQL 和 MariaDB 经历了不同的发展。但是,MariaDB 采用 MySQL 的数据和表定义文件,还使用相同的客户端协议、客户端 API、端口和套接字。这是为了让 MySQL 用户能够轻松切换到 MariaDB。
systemctl enable mariadb // 设置mariadb开机自启动
systemctl start mariadb // 启动mariadb服务
systemctl status mariadb // 查看mariadb状态
设置数据库权限
执行
mysql
命令进入MariaDB控制台,然后在MariaDB控制台中执行下面命令(注意#开始的是注释,不要执行):# 生成slurm用户,以便该用户操作slurm_acct_db数据库,其密码是SomePassWD create user 'slurm'@'localhost' identified by '123456'; # 生成账户数据库slurm_acct_db create database slurm_acct_db; # 赋予slurm从本机localhost采用密码SomePassWD登录具备操作slurm_acct_db数据下所有表的全部权限 grant all on slurm_acct_db.* TO 'slurm'@'localhost' identified by '123456' with grant option; # 赋予slurm从system0采用密码SomePassWD登录具备操作slurm_acct_db数据下所有表的全部权限 grant all on slurm_acct_db.* TO 'slurm'@'system0' identified by '123456' with grant option; # 生成作业信息数据库slurm_jobcomp_db create database slurm_jobcomp_db; # 赋予slurm从本机localhost采用密码SomePassWD登录具备操作slurm_jobcomp_db数据下所有表的全部权限 grant all on slurm_jobcomp_db.* TO 'slurm'@'localhost' identified by '123456' with grant option; # 赋予slurm从system0采用密码SomePassWD登录具备操作slurm_jobcomp_db数据下所有表的全部权限 grant all on slurm_jobcomp_db.* TO 'slurm'@'system0' identified by '123456' with grant option;
启动munge服务
munge为slurm默认的验证机制,各节点 /etc/munge/munge.key 的内容需要一致,且所有者都为munge用户。
systemctl enable munge // 设置munge开机自启动
systemctl start munge // 启动munge服务
systemctl status munge // 查看munge状态
生成密钥信息(如果这个目录已经存在,则不需要生成)
dd if=/dev/random bs=1 count=1024 >/etc/munge/munge.key
拷贝密钥(主节点拷贝其他节点)
#拷贝主节点密钥到其余节点
scp /etc/munge/munge.key munge@ip:/etc/munge
重启munge服务
systemctl restart munge
编译安装slurm
wget https://download.schedmd.com/slurm/slurm-21.08.8.tar.bz2
tar -jxvf slurm-21.08.8.tar.bz2
cd slurm-21.08.8/
./configure --prefix=/usr/local --sysconfdir=/etc/slurm
make -j16
make install
cp -r etc/slurm*.service /etc/systemd/system/
5. 修改slurm 主节点的配置文件
mkdir -p /etc/slurm
在/etc/slurm/ 下创建cgroup.conf文件:(原封不动的粘进去)
###
#
# Slurm cgroup support configuration file
#
# See man slurm.conf and man cgroup.conf for further
# information on cgroup configuration parameters
#--
CgroupAutomount=yes
ConstrainCores=no
ConstrainRAMSpace=no
在/etc/slurm 下创建slurm.conf文件:(原封不动的粘进去,一些密码需要修改 )这个配置文件,实现了 gpus 的限制,以及队列的分配,
ClusterName=slurm-test
SlurmctldHost=cn01
#SlurmctldHost=
#
MpiDefault=none
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
#
#
# JOB PRIORITY
AccountingStorageEnforce=qos,limits
AccountingStorageHost=localhost
AccountingStoragePass=/var/run/munge/munge.socket.2
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageTRES=gres/gpu
JobCompHost=localhost
JobCompLoc=slurm_acct_db
JobCompPass=123456
JobCompType=jobcomp/none
JobCompUser=slurm
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
#GresTypes=gpu
NodeName=cn01 RealMemory=120000 State=UNKNOWN Sockets=2 CoresPerSocket=18 CPUs=36
PartitionName=cpu Nodes=cn01 Default=YES MaxTime=168:00:00 State=UP
上面的代码中的ClusterName表示集群名字,随便填写一个,SlurmctldHost表示主节点的节点名称,可以从hostname获得;
NodeName=computenode 表示计算节点的名称,可以从计算节点的hostname中获取;
Sockets表示服务器cpu的个数,cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
可以获取
CoresPerSocket表示每个cpu的核数,cat /proc/cpuinfo| grep "cpu cores"| uniq
CPUs表示cpu的总数,在没有开启超线程的情况下等于Sockets* CoresPerSocket, 开了超线程的话,cat /proc/cpuinfo | grep "processor" | wc -l
可以获取。
在/etc/slurm 下创建gres.conf文件:在服务端里面不放任何内容
在/etc/slurm 下创建slurmdbd.conf文件(原封不动粘进去,一些密码需要修改)
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
DbdAddr=127.0.0.1
DbdHost=localhost
#DbdPort=7031
SlurmUser=root
#MessageTimeout=300
DebugLevel=verbose
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=localhost
StoragePort=3306
StoragePass=12345
StorageUser=slurm
StorageLoc=slurm_acct_db
chmod 600 /etc/slurm/slurmdbd.conf
启动slurm服务
在服务端只需要启动 slurmdbd slurmctld
systemctl enable slurmdbd
systemctl start slurmdbd
systemctl status slurmdbd
systemctl enable slurmctld
systemctl start slurmctld
systemctl status slurmctld
至此slurm安装完毕,如果启动服务的过程中报错,使用调试方式启动查看启动服务的过程中报错
$ slurmctld -Dvvvvv
$ slurmdbd -Dvvvvv
$ slurmd -Dvvvvv
客户端安装
1.安装必要库文件
sudo su
apt-get install make hwloc libhwloc-dev libmunge-dev libmunge2 munge -y
2.启动munge服务
systemctl enable munge // 设置munge开机自启动
systemctl start munge // 启动munge服务
systemctl status munge // 查看munge状态
#拷贝主节点密钥到其余节点
scp /etc/munge/munge.key munge@ip:/etc/munge
重启munge服务
systemctl restart munge
3.编译安装slurm
wget https://download.schedmd.com/slurm/slurm-21.08.8.tar.bz2
tar -jxvf slurm-21.08.8.tar.bz2
cd slurm-21.08.8/
./configure --prefix=/usr/local --sysconfdir=/etc/slurm
make -j16
make install
cp -r etc/slurm*.service /etc/systemd/system/
4. 根据计算节点信息更新主节点的slurm配置
查看计算节点的名称:hostname
查看计算节点的CPU、内存等信息,然后更新主节点的slurm.conf
# 比如:cn02
NodeName=cn02 RealMemory=120000 State=UNKNOWN Sockets=2 CoresPerSocket=18 CPUs=36
PartitionName=cpu Nodes=cn01,cn02 Default=YES MaxTime=168:00:00 State=UP
如果该节点是GPU节点,则
在/etc/slurm 下创建gres.conf文件:
Name=gpu Type=A800 File=/dev/nvidia[0-7]
并且将slurm.conf中的如下配置项更新:
#GresTypes=gpu
去掉注释,更新为:
GresTypes=gpu
NodeName=cn02 RealMemory=120000 State=UNKNOWN GRES=gpu:8 Sockets=2 CoresPerSocket=18 CPUs=36
更新配置后,在主节点执行下如下命令重新加载配置项:
scontrol reconfigure
5. 把master的slurm配置项拷贝过来
mkdir -p /etc/slurm
#拷贝主节点的slurm.conf和cgroup.conf
scp /etc/slurm/slurm.conf root@ip:etc/slurm/
scp /etc/slurm/cgroup.conf root@ip:/etc/slurm/
scp /etc/slurm/gres.conf root@ip:/etc/slurm/
6.启动slurm服务
在客户端只需要启动slurmd
systemctl enable slurmd
systemctl start slurmd
systemctl status slurmd