Slurm安装
安装环境
基于 ubuntu22.04.2 及 slurm24.05.2
1.规划准备
本安装流程采用一个管理节点兼计算节点,一个额外计算节点
- 集群名:
slurm - 管理节点,同时也作计算节点
主机名:test-slrum-1
IP 地址:192.168.100.12
/opt/slurm NFS 共享目录
服务:
通信认证:munge 数据库:mariadbslurm 数据库:slurmdbd 管理器:slurmctld - 用户登录节点
和管理节点共用 - 数据库节点
和管理节点共用 - 计算机节点
主机名:test-slurm-2
IP 地址:192.168.100.13
服务:
通信认证:mungeslurm 数据库:slurmdbd
2.编译 slurm 安装包
2.1.安装需要的依赖
sudo apt-get install libmunge-dev libmariadb-dev libpam0g-dev libcgroup-dev libhwloc-dev build-essential fakeroot devscripts equivs pdsh
2.2.下载 slurm 源码包
访问 https://www.schedmd.com/downloads.php 下载需要的源码包
所有节点执行以下操作
sudo mkdir /opt/slurm
cd /opt
sudo wget https://download.schedmd.com/slurm/slurm-24.05.2.tar.bz2
解压缩
sudo tar -xaf slurm-24.05.2.tar.bz2
进入解压后的目录
cd slurm-24.05.2/
可以修改当前目录下 debian/control 需要的包,默认不需要改动
执行命令安装依赖
sudo mk-build-deps -i debian/control
生成 slurm 安装包
sudo debuild -b -uc -us
正常结束后会在上级目录生成 DEB 包,如下
ubuntu@test-slurm-1:/opt/slurm$ ls
slurm-24.05.2
slurm-smd_24.05.2-1_amd64.build
slurm-smd_24.05.2-1_amd64.buildinfo
slurm-smd_24.05.2-1_amd64.changes
slurm-smd_24.05.2-1_amd64.deb
slurm-smd-client_24.05.2-1_amd64.deb
slurm-smd-client-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-dev_24.05.2-1_amd64.deb
slurm-smd-doc_24.05.2-1_all.deb
slurm-smd-libnss-slurm_24.05.2-1_amd64.deb
slurm-smd-libnss-slurm-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-libpam-slurm-adopt_24.05.2-1_amd64.deb
slurm-smd-libpam-slurm-adopt-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-libpmi0_24.05.2-1_amd64.deb
slurm-smd-libpmi0-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-libpmi2-0_24.05.2-1_amd64.deb
slurm-smd-libpmi2-0-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-libslurm-perl_24.05.2-1_amd64.deb
slurm-smd-libslurm-perl-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-openlava_24.05.2-1_all.deb
slurm-smd-sackd_24.05.2-1_amd64.deb
slurm-smd-sackd-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-slurmctld_24.05.2-1_amd64.deb
slurm-smd-slurmctld-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-slurmd_24.05.2-1_amd64.deb
slurm-smd-slurmdbd_24.05.2-1_amd64.deb
slurm-smd-slurmdbd-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-slurmd-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-slurmrestd_24.05.2-1_amd64.deb
slurm-smd-slurmrestd-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-sview_24.05.2-1_amd64.deb
slurm-smd-sview-dbgsym_24.05.2-1_amd64.ddeb
slurm-smd-torque_24.05.2-1_all.deb
2.3.设置仓库
创建 APT 仓库
sudo mkdir -p /opt/slurm/debs
复制之前生成的 APT 文件到 /opt/slurm/debs 目录
cd /opt/slurm
sudo cp slurm*.deb /opt/slurm/debs
安装 APT 包索引生成工具
sudo apt-get install dpkg-dev
在本地库索引
cd /opt/slurm
sudo chmod 777 -R debs/
sudo dpkg-scanpackages debs /dev/null | gzip > debs/Packages.gz
编辑源配置文件
sudo nano /etc/apt/sources.list.d/slurm.list
添加以下内容
deb [trusted=yes] file:/opt/slurm debs/
执行更新包列表
sudo apt update
3.管理节点和计算节点安装
3.1.安装所需的 slurm 包
管理节点兼计算节点
sudo apt -y install slurm-smd slurm-smd-slurmctld slurm-smd-client slurm-smd-slurmdbd slurm-smd-slurmd
计算节点
sudo apt -y install slurm-smd slurm-smd-slurmd slurm-smd-client
各节点修改 hosts
- 在管理节点修改
sudo nano /etc/hosts
添加以下内容
192.168.109.13 test-slurm-2
- 在计算节点修改
sudo nano /etc/hosts
添加以下内容
192.168.109.12 test-slurm-1
3.2.生成 slurm 用户
slurm 用户 uid 和 gid 在不同节点中需相同
sudo useradd slurm
检查两台节点内 uid 和 gid 是否相同
ubuntu@test-slurm-1:/opt/slurm$ cat /etc/passwd | grep slurm
slurm:x:1001:1001::/home/slurm:/bin/sh
ubuntu@test-slurm-2:/opt/slurm$ cat /etc/passwd | grep slurm
slurm:x:1001:1001::/home/slurm:/bin/sh
3.3.设置通讯所需的 munge 服务
各节点安装 munge 包
sudo apt -y install munge
ubuntu 已默认生成文件 /etc/munge/munge.key
在计算节点修改 munge 文件权限,并备份
sudo chmod 777 -R /etc/munge
cd /etc/munge
sudo mv munge.key munge.key.bk
将管理节点的 munge.key 文件复制到其它节点,并修改所有者为 munge 用户
文件复制后,在计算节点执行以下命令
cd /etc/munge
sudo chown munge:munge munge.key
所有节点将 /etc/munge 文件夹权限修改为 755,其中的 munge.key 修改为 400
sudo chmod 400 munge.key
sudo chmod 755 /etc/munge/
启动 munge
sudo systemctl restart munge.service
sudo systemctl enable munge.service
3.4.设置主配置文件
Slurm 主配置文件在 /etc/slurm 目录下
本安装手册内计算节点采用无配置模式,即只需修改管理节点的配置文件即可
内容模板可访问配置工具填写相应信息生成,然后修改
sudo nano /etc/slurm/slurm.conf
# Cluster Name:集群名
ClusterName=MyCluster # 集群名,任意英文和数字名字
# Control Machines:Slurmctld控制进程节点
SlurmctldHost=test-slurm-1 # 启动slurmctld进程的节点名,如这里的test-slurm-1
# BackupController= # 冗余备份节点,可空着
SlurmctldParameters=enable_configless # 采用无配置模式
# Slurm User:Slurm用户
SlurmUser=slurm # slurmctld启动时采用的用户名
# Slurm Port Numbers:Slurm服务通信端口
SlurmctldPort=6817 # Slurmctld服务端口,设为6817,如不设置,默认为6817号端口
SlurmdPort=6818 # Slurmd服务端口,设为6818,如不设置,默认为6818号端口
# State Preservation:状态保持
StateSaveLocation=/var/spool/slurmctld # 存储slurmctld服务状态的目录,如有备份控制节点,则需要所有SlurmctldHost节点都能共享读写该目录
SlurmdSpoolDir=/var/spool/slurmd # Slurmd服务所需要的目录,为各节点各自私有目录,不得多个slurmd节点共享
ReturnToService=1 #设定当DOWN(失去响应)状态节点如何恢复服务,默认为0。
# 0: 节点状态保持DOWN状态,只有当管理员明确使其恢复服务时才恢复
# 1: 仅当由于无响应而将DOWN节点设置为DOWN状态时,才可以当有效配置注册后使DOWN节点恢复服务。如节点由于任何其它原因(内存不足、意外重启等)被设置为DOWN,其状态将不会自动更改。当节点的内存、GRES、CPU计数等等于或大于slurm.conf中配置的值时,该节点才注册为有效配置。
# 2: 使用有效配置注册后,DOWN节点将可供使用。该节点可能因任何原因被设置为DOWN状态。当节点的内存、GRES、CPU计数等等于或大于slurm.conf 中配置的值,该节点才注册为有效配置。
# Default MPI Type:默认MPI类型
MPIDefault=None
# MPI-PMI2: 对支持PMI2的MPI实现
# MPI-PMIx: Exascale PMI实现
# None: 对于大多数其它MPI,建议设置
# Process Tracking:进程追踪,定义用于确定特定的作业所对应的进程的算法,它使用信号、杀死和记账与作业步相关联的进程
# ProctrackType=proctrack/cgroup
# Cgroup: 采用Linux cgroup来生成作业容器并追踪进程,需要设定/etc/slurm/cgroup.conf文件
# Cray XC: 采用Cray XC专有进程追踪
# LinuxProc: 采用父进程IP记录,进程可以脱离Slurm控制
# Pgid: 采用Unix进程组ID(Process Group ID),进程如改变了其进程组ID则可以脱离Slurm控制
# Scheduling:调度
# DefMemPerCPU=0 # 默认每颗CPU可用内存,以MB为单位,0为不限制。如果将单个处理器分配给作业(SelectType=select/cons_res 或 SelectType=select/cons_tres),通常会使用DefMemPerCPU
# MaxMemPerCPU=0 # 最大每颗CPU可用内存,以MB为单位,0为不限制。如果将单个处理器分配给作业(SelectType=select/cons_res 或 SelectType=select/cons_tres),通常会使用MaxMemPerCPU
# SchedulerTimeSlice=30 # 当GANG调度启用时的时间片长度,以秒为单位
SchedulerType=sched/backfill # 要使用的调度程序的类型。注意,slurmctld守护程序必须重新启动才能使调度程序类型的更改生效(重新配置正在运行的守护程序对此参数无效)。如果需要,可以使用scontrol命令手动更改作业优先级。可接受的类型为:
# sched/backfill # 用于回填调度模块以增加默认FIFO调度。如这样做不会延迟任何较高优先级作业的预期启动时间,则回填调度将启动较低优先级作业。回填调度的有效性取决于用户指定的作业时间限制,否则所有作业将具有相同的时间限制,并且回填是不可能的。注意上面SchedulerParameters选项的文档。这是默认配置
# sched/builtin # 按优先级顺序启动作业的FIFO调度程序。如队列中的任何作业无法调度,则不会调度该队列中优先级较低的作业。对于作业的一个例外是由于队列限制(如时间限制)或关闭/耗尽节点而无法运行。在这种情况下,可以启动较低优先级的作业,而不会影响较高优先级的作业。
# sched/hold # 如果 /etc/slurm.hold 文件存在,则暂停所有新提交的作业,否则使用内置的FIFO调度程序。
# Resource Selection:资源选择,定义作业资源(节点)选择算法
SelectType=select/cons_tres
# select/cons_tres: 单个的CPU核、内存、GPU及其它可追踪资源作为可消费资源(消费及分配),建议设置
# select/cons_res: 单个的CPU核和内存作为可消费资源
# select/cray_aries: 对于Cray系统
# select/linear: 基于主机的作为可消费资源,不管理单个CPU等的分配
# SelectTypeParameters:资源选择类型参数,当SelectType=select/linear时仅支持CR_ONE_TASK_PER_CORE和CR_Memory;当SelectType=select/cons_res、SelectType=select/cray_aries和SelectType=select/cons_tres时,默认采用CR_Core_Memory
SelectTypeParameters=CR_Core_Memory
# CR_CPU: CPU核数作为可消费资源
# CR_Socket: 整颗CPU作为可消费资源
# CR_Core: CPU核作为可消费资源,默认
# CR_Memory: 内存作为可消费资源,CR_Memory假定MaxShare大于等于1
# CR_CPU_Memory: CPU和内存作为可消费资源
# CR_Socket_Memory: 整颗CPU和内存作为可消费资源
# CR_Core_Memory: CPU和和内存作为可消费资源
# Task Launch:任务启动
# TaskPlugin=task/cgroup,task/affinity #设定任务启动插件。可被用于提供节点内的资源管理(如绑定任务到特定处理器),TaskPlugin值可为:
# task/affinity: CPU亲和支持(man srun查看其中--cpu-bind、--mem-bind和-E选项)
# task/cgroup: 强制采用Linux控制组cgroup分配资源(man group.conf查看帮助)
# task/none: #无任务启动动作
# Prolog and Epilog:前处理及后处理
# Prolog/Epilog: 完整的绝对路径,在用户作业开始前(Prolog)或结束后(Epilog)在其每个运行节点上都采用root用户执行,可用于初始化某些参数、清理作业运行后的可删除文件等
# Prolog=/opt/bin/prolog.sh # 作业开始运行前需要执行的文件,采用root用户执行
# Epilog=/opt/bin/epilog.sh # 作业结束运行后需要执行的文件,采用root用户执行
# SrunProlog/Epilog # 完整的绝对路径,在用户作业步开始前(SrunProlog)或结束后(Epilog)在其每个运行节点上都被srun执行,这些参数可以被srun的--prolog和--epilog选项覆盖
# SrunProlog=/opt/bin/srunprolog.sh # 在srun作业开始运行前需要执行的文件,采用运行srun命令的用户执行
# SrunEpilog=/opt/bin/srunepilog.sh # 在srun作业结束运行后需要执行的文件,采用运行srun命令的用户执行
# TaskProlog/Epilog: 绝对路径,在用户任务开始前(Prolog)和结束后(Epilog)在其每个运行节点上都采用运行作业的用户身份执行
# TaskProlog=/opt/bin/taskprolog.sh # 作业开始运行前需要执行的文件,采用运行作业的用户执行
# TaskEpilog=/opt/bin/taskepilog.sh # 作业结束后需要执行的文件,采用运行作业的用户执行行
# 顺序:
# 1. pre_launch_priv():TaskPlugin内部函数
# 2. pre_launch():TaskPlugin内部函数
# 3. TaskProlog:slurm.conf中定义的系统范围每个任务
# 4. User prolog:作业步指定的,采用srun命令的--task-prolog参数或SLURM_TASK_PROLOG环境变量指定
# 5. Task:作业步任务中执行
# 6. User epilog:作业步指定的,采用srun命令的--task-epilog参数或SLURM_TASK_EPILOG环境变量指定
# 7. TaskEpilog:slurm.conf中定义的系统范围每个任务
# 8. post_term():TaskPlugin内部函数
# Event Logging:事件记录
# Slurmctld和slurmd守护进程可以配置为采用不同级别的详细度记录,从0(不记录)到7(极度详细)
SlurmctldDebug=info # 默认为info
SlurmctldLogFile=/var/log/slurm/slurmctld.log # 如是空白,则记录到syslog
SlurmdDebug=info # 默认为info
SlurmdLogFile=/var/log/slurm/slurmd.log # 如为空白,则记录到syslog,如名字中的有字符串"%h",则"%h"将被替换为节点名
# Job Completion Logging:作业完成记录
JobCompType=jobcomp/mysql
# 指定作业完成是采用的记录机制,默认为None,可为以下值之一:
# None: 不记录作业完成信息
# Elasticsearch: 将作业完成信息记录到Elasticsearch服务器
# FileTxt: 将作业完成信息记录在一个纯文本文件中
# Lua: 利用名为jobcomp.lua的文件记录作业完成信息
# Script: 采用任意脚本对原始作业完成信息进行处理后记录
# MySQL: 将完成状态写入MySQL或MariaDB数据库
# JobCompLoc= # 设定记录作业完成信息的文本文件位置(若JobCompType=filetxt),或将要运行的脚本(若JobCompType=script),或Elasticsearch服务器的URL(若JobCompType=elasticsearch),或数据库名字(JobCompType为其它值时)
# 设定数据库在哪里运行,且如何连接
JobCompHost=localhost # 存储作业完成信息的数据库主机名
# JobCompPort= # 存储作业完成信息的数据库服务器监听端口
JobCompUser=slurm # 用于与存储作业完成信息数据库进行对话的用户名
JobCompPass=SomePassWD # 用于与存储作业完成信息数据库进行对话的用户密码
# Job Accounting Gather:作业记账收集
JobAcctGatherType=jobacct_gather/linux # Slurm记录每个作业消耗的资源,JobAcctGatherType值可为以下之一:
# jobacct_gather/none: 不对作业记账
# jobacct_gather/cgroup: 收集Linux cgroup信息
# jobacct_gather/linux: 收集Linux进程表信息,建议
JobAcctGatherFrequency=30 # 设定轮寻间隔,以秒为单位。若为-,则禁止周期性抽样
# Job Accounting Storage:作业记账存储
AccountingStorageType=accounting_storage/slurmdbd # 与作业记账收集一起,Slurm可以采用不同风格存储可以以许多不同的方式存储会计信息,可为以下值之一:
# accounting_storage/none: 不记录记账信息
# accounting_storage/slurmdbd: 将作业记账信息写入Slurm DBD数据库
# AccountingStorageLoc: 设定文件位置或数据库名,为完整绝对路径或为数据库的数据库名,当采用slurmdb时默认为slurm_acct_db
# 设定记账数据库信息,及如何连接
AccountingStorageHost=localhost # 记账数据库主机名
# AccountingStoragePort= # 记账数据库服务监听端口
# AccountingStorageUser=slurm # 记账数据库用户名
# AccountingStoragePass=slurm # 记账数据库用户密码。对于SlurmDBD,提供企业范围的身份验证,如采用于Munge守护进程,则这是应该用munge套接字socket名(/var/run/munge/global.socket.2)代替。默认不设置
# AccountingStoreFlags= # 以逗号(,)分割的列表。选项是:
# job_comment:在数据库中存储作业说明域
# job_script:在数据库中存储脚本
# job_env:存储批处理作业的环境变量
# AccountingStorageTRES=gres/gpu # 设置GPU时需要
# GresTypes=gpu # 设置GPU时需要
# Process ID Logging:进程ID记录,定义记录守护进程的进程ID的位置
SlurmctldPidFile=/var/run/slurmctld.pid # 存储slurmctld进程号PID的文件
SlurmdPidFile=/var/run/slurmd.pid # 存储slurmd进程号PID的文件
# Timers:定时器
SlurmctldTimeout=120 # 设定备份控制器在主控制器等待多少秒后成为激活的控制器
SlurmdTimeout=300 # Slurm控制器等待slurmd未响应请求多少秒后将该节点状态设置为DOWN
InactiveLimit=0 # 潜伏期控制器等待srun命令响应多少秒后,将在考虑作业或作业步骤不活动并终止它之前。0表示无限长等待
MinJobAge=300 # Slurm控制器在等待作业结束多少秒后清理其记录
KillWait=30 # 在作业到达其时间限制前等待多少秒后在发送SIGKILLL信号之前发送TERM信号以优雅地终止
WaitTime=0 # 在一个作业步的第一个任务结束后等待多少秒后结束所有其它任务,0表示无限长等待
# Compute Machines:计算节点
NodeName=test-slurm-1 NodeAddr=192.168.109.12 CPUs=1 RealMemory=1024 Sockets=1 CoresPerSocket=1 ThreadsPerCore=1 State=UNKNOWN
NodeName=test-slurm-2 NodeAddr=192.168.109.13 CPUs=1 RealMemory=1024 Sockets=1 CoresPerSocket=1 ThreadsPerCore=1 State=UNKNOWN
# NodeName=gnode[01-10] Gres=gpu:v100:2 CPUs=40 RealMemory=385560 Sockets=2 CoresPerSocket=20 ThreadsPerCore=1 State=UNKNOWN #GPU节点例子,主要为Gres=gpu:v100:2
# NodeName=node[1-10] # 计算节点名,node[1-10]表示为从node1、node2连续编号到node10,其余类似
# NodeAddr=192.168.1.[1-10] # 计算节点IP
# CPUs=48 # 节点内CPU核数,如开着超线程,则按照2倍核数计算,其值为:Sockets*CoresPerSocket*ThreadsPerCore
# RealMemory=192000 # 节点内作业可用内存数(MB),一般不大于free -m的输出,当启用select/cons_res插件限制内存时使用
# Sockets=2 # 节点内CPU颗数
# CoresPerSocket=24 # 每颗CPU核数
# ThreadsPerCore=1 # 每核逻辑线程数,如开了超线程,则为2
# State=UNKNOWN # 状态,是否启用,State可以为以下之一:
# CLOUD # 在云上存在
# DOWN # 节点失效,不能分配给在作业
# DRAIN # 节点不能分配给作业
# FAIL # 节点即将失效,不能接受分配新作业
# FAILING # 节点即将失效,但上面有作业未完成,不能接收新作业
# FUTURE # 节点为了将来使用,当Slurm守护进程启动时设置为不存在,可以之后采用scontrol命令简单地改变其状态,而不是需要重启slurmctld守护进程。当这些节点有效后,修改slurm.conf中它们的State。在它们被设置为有效前,采用Slurm看不到它们,也尝试与其联系。
# 动态未来节点(Dynamic Future Nodes):
# slurmd启动时如有-F[<feature>]参数,将关联到一个与slurmd -C命令显示配置(sockets、cores、threads)相同的配置的FUTURE节点。节点的NodeAddr和NodeHostname从slurmd守护进程自动获取,并且当被设置为FUTURE状态后自动清除。动态未来节点在重启时保持non-FUTURE状态。利用scontrol可以将其设置为FUTURE状态。
# 若NodeName与slurmd的HostName映射未通过DNS更新,动态未来节点不知道在之间如何进行通信,其原因在于NodeAddr和NodeHostName未在slurm.conf被定义,而且扇出通信(fanout communication)需要通过将TreeWidth设置为一个较高的数字(如65533)来使其无效。若做了DNS映射,则可以使用cloud_dns SlurmctldParameter。
# UNKNOWN # 节点状态未被定义,但将在节点上启动slurmd进程后设置为BUSY或IDLE,该为默认值。
PartitionName=batch Nodes=test-slurm-[1-2] Default=YES MaxTime=INFINITE State=UP
# PartitionName=batch # 队列分区名
# Nodes=node[1-10] # 节点名
# Default=Yes # 作为默认队列,运行作业不知明队列名时采用的队列
# MaxTime=INFINITE # 作业最大运行时间,以分钟为单位,INFINITE表示为无限制
# State=UP # 状态,是否启用
# Gres=gpu:v100:2 # 设置节点有两块v100 GPU卡,需要在GPU节点 /etc/slum/gres.conf 文件中有类似下面配置:
#AutoDetect=nvml
# Name=gpu Type=v100 File=/dev/nvidia[0-1] #设置资源的名称Name是gpu,类型Type为v100,名称与类型可以任意取,但需要与其它方面配置对应,File=/dev/nvidia[0-1]指明了使用的GPU设备。
#Name=mps Count=100
设置数据存储配置文件 slurmdbd.conf,只需要管理节点进行配置
sudo nano /etc/slurm/slurmdbd.conf
# 认证信息
AuthType=auth/munge # 认证方式,该处采用munge进行认证
AuthInfo=/var/run/munge/munge.socket.2 # 为了与slurmctld控制节点通信的其它认证信息
#
# slurmDBD信息
DbdHost=localhost # 数据库节点名
DbdAddr=127.0.0.1 # 数据库IP地址
# DbdBackupHost=admin2 # 数据库冗余备份节点
# DbdPort=7031 # 数据库端口号,默认为7031
SlurmUser=slurm # 用户数据库操作的用户
MessageTimeout=60 # 允许以秒为单位完成往返通信的时间,默认为10秒
DebugLevel=debug5 # 调试信息级别,quiet:无调试信息;fatal:仅严重错误信息;error:仅错误信息; info:错误与通常信息;verbose:错误和详细信息;debug:错误、详细和调试信息;debug2:错误、详细和更多调试信息;debug3:错误、详细和甚至更多调试信息;debug4:错误、详细和甚至更多调试信息;debug5:错误、详细和甚至更多调试信息。debug数字越大,信息越详细
DefaultQOS=normal # 默认QOS
LogFile=/var/log/slurm/slurmdbd.log # slurmdbd守护进程日志文件绝对路径
PidFile=/var/run/slurmdbd.pid # slurmdbd守护进程存储进程号文件绝对路径
# PrivateData=accounts,users,usage,jobs # 对于普通用户隐藏的数据。默认所有信息对所有用户开放,SlurmUser、root和AdminLevel=Admin用户可以查看所有信息。多个值可以采用逗号(,)分割:
# accounts:阻止用户查看账户信息,除非该用户是他们的协调人
# events:阻止用户查看事件信息,除非该用户具有操作员或更高级身份
# jobs:阻止普户查看其他用户的作业信息,除非该用户是使用 sacct 时运行作业的帐户的协调员。
# reservations:限制具有操作员及以上身份的用户获取资源预留信息。
# usage:阻止用户查看其他用户利用率。适用于sreport命令
# users:阻止用户查看除自己以外的任何用户的信息,使得用户只能看到他们处理的关联。协调人可以看到他们作为协调人的帐户中所有用户的关联,但只有在列出用户时才能看到自己。
#TrackWCKey=yes # 工作负载特征键。用于设置Workload Characterization Key的显示和跟踪。必须设置为跟踪wckey的使用。这必须设置为从WCKeys生成汇总使用表。注意:如果在此处设置TrackWCKey而不是在您的各种slurm.conf文件中,则所有作业都将归因于它们的默认WCKey。
#
# Database信息,详细解释参见前面slurm.conf中的
StorageType=accounting_storage/mysql # 数据存储类型
StorageHost=localhost # 存储数据库节点名
StorageLoc=slurm_acct_db # 存储位置
StoragePort=3306 # 存储数据库服务端口号
StorageUser=slurm # 存储数据库用户名
StoragePass=slurm # 存储数据库密码
3.5.配置 cgroup
只需要管理节点进行配置
sudo nano /etc/slurm/cgroup.conf
添加以下内容
CgroupAutomount=yes
ConstrainCores=no
ConstrainRAMSpace=no
设置 slurm 文件及目录的权限
sudo chown slurm.slurm /etc/slurm/slurmdbd.conf
sudo chmod 600 /etc/slurm/slurmdbd.conf
sudo chown ubuntu /etc/slurm/slurm.conf
sudo mkdir /var/spool/slurmctld
sudo chown slurm.slurm /var/spool/slurmctld
chown -R slurm:slurm /var/log/slurm
启动服务
sudo systemctl enable slurmdbd
sudo systemctl restart slurmdbd
3.6.设置 mariadb 数据库
安装数据库,只需要管理节点进行安装
sudo apt install mariadb-server mariadb-client
sudo systemctl enable mariadb
sudo systemctl restart mariadb
设置数据库密码
sudo mysql_secure_installation
除了第一个选择n,其它就建议使用默认Y。
1. Switch to unix_socket authentication 选择是否使用 Unix Socket 身份验证代替传统的用户名和密码方式。如果需要远程连接数据库,请选择n。
2. Change the root password 为 root 设置一个强密码,这是提升安全性的关键步骤。
3. Remove anonymous users 匿名用户可能带来安全风险,建议删除。
4. Disallow root login remotely 限制 root 用户只能在本地登录,增加安全性。
5. Remove test database and access to it 删除 MariaDB 默认提供的测试数据库,减少安全风险。
6. Reload privilege tables now 立即重新加载权限表,让所有更改立即生效。
登录数据库
mysql -u root -p
生成 slurm 用户,以便该用户操作 slurm_acct_db 数据库,其密码是 slurm
create user 'slurm'@'localhost' identified by 'slurm';
生成账户数据库 slurm_acct_db
create database slurm_acct_db;
赋予 slurm 从本机 localhost 采用密码 slurm 登录具备操作 slurm_acct_db 数据下所有表的全部权限
grant all on slurm_acct_db.* TO 'slurm'@'localhost' identified by 'slurm' with grant option;
赋予 slurm 从 system0 采用密码 slurm 登录具备操作 slurm_acct_db 数据下所有表的全部权限
grant all on slurm_acct_db.* TO 'slurm'@'system0' identified by 'slurm' with grant option;
生成作业信息数据库 slurm_jobcomp_db
create database slurm_jobcomp_db;
赋予 slurm 从本机 localhost 采用密码 slurm 登录具备操作 slurm_jobcomp_db 数据下所有表的全部权限
grant all on slurm_jobcomp_db.* TO 'slurm'@'localhost' identified by 'slurm' with grant option;
赋予 slurm 从 system0 采用密码 slurm 登录具备操作 slurm_jobcomp_db 数据下所有表的全部权限
grant all on slurm_jobcomp_db.* TO 'slurm'@'system0' identified by 'slurm' with grant option;
3.7.重启 slurmctld 服务
sudo systemctl restart slurmctld
sudo systemctl enable slurmctld
4.配置计算节点服务
编辑计算节点配置文件,管理节点无需配置
sudo nano slurmd.service
修改内容为
[Unit]
Description=Slurm node daemon
After=munge.service network-online.target remote-fs.target
Wants=network-online.target
# ConditionPathExists=/etc/slurm/slurm.conf
[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/slurmd
# 增加--conf-server test-slurm-1:6817设定slurmctld服务节点
ExecStart=/usr/sbin/slurmd --conf-server test-slurm-1:6817 -D -s $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
LimitNOFILE=131072
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes
[Install]
WantedBy=multi-user.target
各计算节点启动 slurmd 服务
sudo systemctl daemon-reload
sudo systemctl restart slurmd
5.检查服务
5.1.节点状态检查
ubuntu@test-slurm-1:/etc/slurm$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
batch* up infinite 2 idle test-slurm-[1-2]
解释如下:
PARRITION:节点所在分区。
AVAIL:分区状态,up 标识可用,down 标识不可用。
TIMELIMIT: 程序运行最大时长,infinite 表示不限制,限制格式为 days-houres:minutes:seconds。
NODES:节点数。
NODELIST:节点名列表。
STATE:节点状态,可能的状态包括:
allocated、alloc:已分配
completing、comp:完成中
down:宕机
drained、drain:已失去活力
fail:失效
idle:空闲
mixed:混合,节点在运行作业,但有些空闲 CPU 核,可接受新作业
reserved、resv:资源预留
unknown、unk:未知原因
注意:如果状态带有后缀*,表示节点没有响应
如执行 sinfo 命令显示节点 STATE 为 down、drain 等不正常状态
可先执行 scontrol show node 查看具体原因
5.2 修改 slurm.conf 等配置文件后重启节点
管理节点重启 slurmctld 和 slurmd,计算节点重启 slurmd
sudo systemctl restart slurmctld
sudo systemctl restart slurmd
设置节点状态
scontrol update NodeName=<nodename> State=RESUME
6.GPU 资源配置
各 GPU 节点新增文件 /etc/slurm/gres.conf,同时修改 /etc/slurm/slurm.conf
#AutoDetect=nvml
Name=gpu Type=v100 File=/dev/nvidia[0-1] # Type设定卡类型,如V100、A100等,需与队列中的gres选项对应,File对应GPU设备名,[0-1]表示有两个GPU设备/dev/nvidia0与/dev/nvidia1
#Name=mps Count=100
参考资料:
slurm 官网
slurm 安装配置
slurm 安装配置