【HPC最全最新离线安装开源资源管理、作业调度软件-SLURM】

文章目录

    • HPC 离线最全安装开源资源管理、作业调度软件-SLURM
        • 一、★ 软件简介
          • 1.1 软件定义
          • 1.2 软件架构
          • 1.3 slurm 插件
          • 1.5 slurm配置模式分类
          • 1.6 slurm无配置方式
        • 二、★ 安装环境
          • 2.1 集群环境规划
          • 2.2 系统及软件包信息
          • 2.3 管理/计算节点无秘钥访问
          • 2.4 PDSH管理/计算节点网路传输
        • 三、★ slurm依赖软件源码安装
          • 3.1 三方依赖包安装
          • 3.2 munge认证服务编译安装
          • 3.3 mariadb数据库安装
          • 3.4 pmix3/pmix4并行插件安装
        • 四、★ slurm主程序编译安装
          • 4.1 管理/登录/数据库节点slurm账号建立
          • 4.2 管理/登录/数据库节点slurm安装
          • 4.3 slurm.conf主配置文件
          • 4.4 cgroup.conf文件配置
          • 4.5 slurmdb.conf文件配置
          • 4.6 计算节点启动文件配置
          • 4.7 启动slurm及相关服务
          • 4.8 pam插件安装(可选)
        • 五、★ slurm基本命令
          • 5.1 sinfo 查看集群状态
          • 5.2 squeue 查看作业信息
          • 5.3 sbatch 作业脚本提交
          • 5.4 scontrol 节点状态信息
          • 5.5 sacct 完成作业信息
        • 六、★ slurm提交并行作业
            • 6.1 sbatch提交并行计算脚本
            • 6.2 sbatch 提交star-ccm+脚本
        • 七、最后

HPC 离线最全安装开源资源管理、作业调度软件-SLURM

一、★ 软件简介

1.1 软件定义

Slurm(Simple Linux Utility for Resource Management, http://slurm.schedmd.com/ )是开源的、具有容错性和高度可扩展的Linux集群超级计算系统资源管理和作业调度系统。超级计算系统可利用Slurm对资源和作业进行管理,以避免相互干扰,提高运行效率。所有需运行的作业,无论是用于程序调试还是业务计算,都可以通过交互式并行 srun 、批处理式 sbatch 或分配式 salloc 等命令提交,提交后可以利用相关命令查询作业状态等。

1.2 软件架构

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 ,可认证集群、有效用户、有效记账账户等。

【HPC最全最新离线安装开源资源管理、作业调度软件-SLURM】_第1张图片

1.3 slurm 插件
  • cgroup 任务约束 如果存在 hwloc 开发库,将构建任务/cgroup 插件。
  • HDF5 作业分析 如果存在 HDF5 开发库,将构建 acct_gather_profile/hdf5 作业分析插件。
  • HTML 手册页 如果存在 man2html 命令,将生成手册页的 HTML 版本。
  • IPMI 能耗 如果存在 freeipmi 开发库,将构建 acct_gather_energy/ipmi 会计插件。
  • InfiniBand Accounting 如果存在 libibmad 和 libibumad 开发库,将构建 acct_gather_interconnect/ofed InfiniBand 插件。
  • Lua 支持 如果存在 lua 开发库,lua API 将在各种插件中可用。
  • MUNGE 如果安装了 MUNGE 身份验证开发库,将构建身份验证/munge 插件。MUNGE用作默认的身份验证机制。
  • MySQL MySQL对会计的支持将建立在mysql开发库(最好是5.5或更高版本)或MariaDB开发库存在的情况下。
  • PAM 支持 如果安装了 PAM 开发库,将添加 PAM 支持。
  • 如果安装了 numa 开发库,则任务/关联插件中的 NUMA 关联 NUMA 支持将可用。
  • Readline 支持 如果存在 readline 开发库,则 scontrol 和 sacctmgr 交互模式下的 readline 支持将可用。
  • RRD 外部传感器数据收集 如果存在 rrdtool 开发库,则将构建 ext_sensors/rrd 插件。
  • sview 仅当安装了 gtk2时,才会构建 sview 命令。
1.5 slurm配置模式分类
  • 传统模式:客户节点采用 /etc/slurm/ 目录下的 slurm.conf 等配置文件进行配置。
  • 无配置(configless)模式:计算节点无需配置 /etc/slurm 目录下相应的配置文件。(20.02版起支持)

注意! slurm.conf配置文件的位置,是根据安装方式不同而不同的,如果是利用rpmbuild,那么默认的位置就是/etc/slurm下;如果是源码安装且没有指定–prefix安装位置,那么就在/usr/local下寻找;如果是源码安装利用–prefix参数指定了位置了,那就是在指定的位置下寻找。本篇是指定了安装位置。

无配置模式说明

无配置模式是Slurm的一项新特性(从20.02版起支持),可以允许计算节点和用户登录节点从slurmctld守护进程获取配置而无需采用 /etc/slurm 等目录下的本地配置文件。集群在Slurm控制节点上统一控制配置文件,计算节点、登录节点和其它集群节点只需通过 /lib/systemd/system/slurmd.service 文件配置slurmd服务启动参数,利用启动后的slurmd服务获取所需配置信息即可,而无需复制管理节点上的这些文件成为本地文件(降低文件配置不一样的风险)。支持的配置文件有:

  • slurm.conf
  • acct_gather.conf
  • cgroup.conf
  • cgroup_allowed_devices_file.conf
  • cli_filter.lua
  • ext_sensors.conf
  • gres.conf
  • helpers.conf
  • job_container.conf
  • knl_cray.conf
  • knl_generic.conf
  • oci.conf
  • plugstack.conf
  • topology.conf
1.6 slurm无配置方式

slurmd服务启动时将从指定的slurmctld节点获取配置文件,slurmctld节点也可以采用 --conf-server 参数准确指定

  • 采用 --conf-server 参数指定(默认端口6817可省略):

    • 仅一个管理节点slurmctl-primary:slurmd --conf-server slurmctl-primary:6817

    • 一个管理节点slurmctl-primary和一个备份节点slurmctl-secondary:

      ​ slurmd --conf-server slurmctl-primary:6817,slurmctl-secondary

二、★ 安装环境

2.1 集群环境规划
  • 集群名:LDD-cluster

  • 管理节点:LDD-manage

    • 内网IP:193.168.100.10
    • munge安装路径:/opt/hpc/slurm/munge-0.5.15
    • slurm安装路径 :/opt/hpc/slurm/slurm-23.02.1
    • 配置文件: /opt/hpc/slurm/slurm-23.02.1/etc目录下的 cgroup.confslurm.confslurmdbd.conf 等文件
  • 需要启动(按顺序)的守护进程服务:

    1. 通信认证:munge

    2. 系统数据库:mariadb

    3. Slurm数据库:slurmdbd

    4. 主控管理器:slurmctld

    5. 登录节点:slurmd

  • 数据库节点(运行slurmdbd服务):

    • 内网IP:193.168.100.10

    • 可与管理节点共用,本篇中与管理节点共用

  • 用户登录节点

    • 内网IP:193.168.100.10
    • 可与管理节点共用,本篇中与管理节点共用
  • 计算节点node[10-20]:

    • 内网IP:193.168.100.[10-20]

    • munge安装路径:/opt/hpc/slurm/munge-0.5.15

    • slurm安装路径:/opt/hpc/slurm/slurm-23.02.1

    • 管理节点root用户可以通过密钥无需输入密码ssh进入各节点安装好

    • 管理节点建立slurm用户后,各计算节点也要建立。但如果配置账号NIS服务可以不需要

    • slurmd计算节点 需要启动(按顺序)的服务:
      1. 通信认证:munge
      2. Slurm数据库:slurmd

2.2 系统及软件包信息
  • 管理节点:centos7.9离线(已配置离线YUM源)
    • Centos7.9_YUM源离线配置链接
  • 权限说明:具有root或sudo权限
  • 编译器版本:GNU4.8.5
  • 三方依赖软件包:
    • mariadb mariadb-devel mariadb-server (离线yum)
    • munge (源码编译安装)
    • hwloc-libs hwloc-devel (离线yum)
    • hdf5(源码编译安装)
    • pam-devel (离线yum)
    • perl-ExtUtils-MakeMaker (离线yum)
    • readline-devel (离线yum)
    • kernel-headers (离线yum)
    • dbus-devel (离线yum)
    • rrdtool rrdtool-devel (离线yum)
    • gtk2 gtk2-devel (离线yum)
    • rpm-build (离线yum)
    • infiniband-diags infiniband-diags-devel (离线yum)
    • libevent libevent-devel (离线yum)
  • 主程序版本:slurm-23.2.01.tar.bz2 (源码编译安装)
  • slurm源码安装包及对应三方库安装包链接->
2.3 管理/计算节点无秘钥访问
  • 管理节点和计算节点需要配置无秘钥认证访问
  • ssh-keygen -t rsa
for i in `seq 10 20`;do ssh-copy-id -i  ~/.ssh/id_rsa.pub   node$i;done
2.4 PDSH管理/计算节点网路传输
  • 使用 pdsh 命令处理个节点文件的传输和命令的执行:

    # 离线安装
    # 版本信息:pdsh-2.34-5.el7.x86_64.rpm pdsh-rcmd-ssh-2.34-5.el7.x86_64.rpm 安装
    # 安装文件存放位置:/opt/hpc/slurm/pdsh-2.34
    for i in `seq 10 20`;do ssh node$i "hostname;cd /opt/hpc/slurm/pdsh-2.34;rpm -ivh *.rpm";done
    
    # 联网安装
     for i in `seq 10 20`;do ssh node$i 'wget -P /etc/pki/rpm-gpg/  http://mirrors.ustc.edu.cn/epel/RPM-GPG-KEY-EPEL-7';done
    for i in `seq 10 20`;do ssh node$i "yum install pdsh -y";done 
    

    注意! 使用pdsh/pdcp命令,需要在管理节点和计算节点都安装PDSH软件包,如果没有安装也可以不用安装,本篇内容还提供for…in…do命令方式同样可以达到与pdsh一样的效果,二者任选其一

三、★ slurm依赖软件源码安装

3.1 三方依赖包安装
# 离线yum方式安装(管理节点)
yum install -y hwloc-libs hwloc-devel pam-devel perl-ExtUtils-MakeMaker readline-devel \
kernel-headers dbus-devel gtk2 gtk2-devel rrdtool rrdtool-devel  libevent libevent-devel \
infiniband-diags infiniband-diags-devel mariadb mariadb-devel mariadb-server
# 离线yum方式安装(计算节点安装)
# pdsh命令方式
sudo pdsh -w node[10-20] "hostname;yum install -y hwloc-libs hwloc-devel pam-devel \
perl-ExtUtils-MakeMaker readline-devel kernel-headers dbus-devel gtk2 gtk2-devel \
rrdtool rrdtool-devel  libevent libevent-devel mariadb mariadb-devel mariadb-server \
infiniband-diags infiniband-diags-devel"

# for..in..do命令方式
for i in `seq 10 20`;do ssh node$i "hostname;yum install -y hwloc-libs hwloc-devel \
pam-devel perl-ExtUtils-MakeMaker readline-devel kernel-headers dbus-devel gtk2 gtk2-devel rrdtool \
rrdtool-devel  libevent libevent-devel";done
3.2 munge认证服务编译安装
# 创建munge账号和组(管理节点)
useradd  -M -s /sbin/nologin -u 600 munge
groupmod -g 600 munge
# 创建munge账号和组(计算节点)
# pdsh命令方式
sudo pdsh -w node[10-20] "hostname;useradd  -M -s /sbin/nologin -u 600 munge;groupmod -g 600 munge"

# for..in..do命令方式
for i in `seq 12 20`;do ssh node$i "hostname;useradd  -M -s /sbin/nologin -u 600 munge;groupmod -g 600 munge";done

注意! 本篇没有配置NIS账号管理服务,所以管理节点和计算节点都需要建立账号(下面slurm账号的建立一样),如果配置了NIS服务,只需要在管理节点创建账号。

# munge软件编译安装
# 软件版本:munge-munge-0.5.15.tar.gz (管理节点安装步骤)
MUNGE_DIR=/opt/hpc/slurm/munge-0.5.15
tar -zxf munge-munge-0.5.15.tar.gz
cd munge-munge-0.5.15/
./bootstrap
./configure --prefix=$MUNGE_DIR \
--sysconfdir=$MUNGE_DIR/etc \
--localstatedir=$MUNGE_DIR/var \
-with-runstatedir=$MUNGE_DIR/var/run
make
sudo make install

# 软件版本:munge-munge-0.5.15.tar.gz(计算节点安装步骤)

# pdsh命令方式
sudo pdsh -w node[10-20] "cd 管理节点munge源码包路径;make install"

# for..in..do命令方式
for i in `seq 10 20`;do ssh node$i "cd 管理节点munge源码包路径;make install";done

注意! 如果出现错误:configure: error: unable to locate cryptographic library,说明缺少包openssl加密库, 利用离线yum安装:yum install openssl openssl-devel

注意! 整个用户的家目录在管理节点和计算节点是共享的,且管理节点和计算节点munge安装目录都是一样的,所以在计算节点安装munge的时候可以直接make install 进行安装。

# 修改目录权限及配置文件 (管理节点配置)
cd $MUNGE_DIR
mkdir -p var/run/munge
chown -R munge.munge ../munge
echo -e "OPTIONS=\"--key-file=/opt/software/install/hpc/slurm/munge/etc/munge/munge.key --num-threads=2\"" >> /opt/hpc/slurm/munge-0.5.15/etc/sysconfig/munge

# 修改目录权限及配置文件 (计算节点配置)

# pdsh命令方式
sudo pdsh -w node[10-20] "cd /opt/hpc/slurm/munge-0.5.15;mkdir -p var/run/munge;chown -R munge.munge ../munge-0.5.15"
sudo pdsh -w node[10-20] "echo -e 'OPTIONS=\"--key-file=/opt/hpc/slurm/munge-0.5.15/etc/munge/munge.key --num-threads=2\"' >> /opt/hpc/slurm/munge-0.5.15/etc/sysconfig/munge"

# for..in..do命令方式
for i in `seq 10 20`;do ssh node$i "cd /opt/hpc/slurm/munge-0.5.15;mkdir -p var/run/munge;chown -R munge.munge ../munge-0.5.15";done
for i in `seq 10 20`;do ssh node$i "echo -e 'OPTIONS=\"--key-file=/opt/hpc/slurm/munge-0.5.15/etc/munge/munge.key --num-threads=2\"' >> /opt/hpc/slurm/munge-0.5.15/etc/sysconfig/munge";done
# 生成munge.key文件(只需管理节点生成,复制到各个计算节点)
cd /opt/hpc/slurm/munge-0.5.15/etc/munge
echo -n "Hello.MyMungeKey.This is your munge key." | sha1sum | cut -d' ' -f1 > munge.key
chmod 600 munge
chown munge.munge /opt/hpc/slurm/munge-0.5.15/etc/munge/munge.key

# pdsh命令方式
pdcp -w node[10-20] munge.key  /opt/hpc/slurm/munge-0.5.15/etc/munge/
pdsh -w node[10-20] "chown munge.munge /opt/hpc/slurm/munge-0.5.15/etc/munge/munge.key"

# for...in...do命令方式
for i in `seq 10 20`;do scp -r munge.key node$i:/opt/hpc/slurm/munge-0.5.15/etc/munge/;done
for i in `seq 10 20`;do ssh node$i "chown munge.munge /opt/hpc/slurm/munge-0.5.15/etc/munge/munge.key";done
# 复制启动文件目录(管理节点)
cp /opt/hpc/slurm/munge-0.5.15/lib/systemd/system/munge.service  /usr/lib/systemd/system/

# 复制到启动文件目录(计算节点)
# pdsh命令方式
sudo pdcp -w node[10-20] /opt/hpc/slurm/munge-0.5.15/lib/systemd/system/munge.service /usr/lib/systemd/system/

# for...in...do命令方式
for i in `seq 10 20`;do scp -r /opt/hpc/slurm/munge-0.5.15/lib/systemd/system/munge.service node$i:/usr/lib/systemd/system/;done
# 启动管理节点munge
systemctl daemon-reload
systemctl enable --now munge.service

# 启动计算节点munge
#pdsh命令方式
sudo pdsh -w node[10-20] "systemctl daemon-reload;systemctl enable --now munge"

# for...in...do命令方式
for i in `seq 10 20`;do ssh node$i "systemctl daemon-reload;systemctl enable --now munge";done
# 安装munge后目录树结构如下
├── bin
│   ├── munge
│   ├── remunge
│   └── unmunge
├── etc
│   ├── logrotate.d
│   │   └── munge
│   ├── munge
│   │   └── munge.key
│   └── sysconfig
│       └── munge
├── include
│   └── munge.h
├── lib
│   ├── libmunge.a
│   ├── libmunge.la
│   ├── libmunge.so -> libmunge.so.2.0.0
│   ├── libmunge.so.2 -> libmunge.so.2.0.0
│   ├── libmunge.so.2.0.0
│   ├── pkgconfig
│   │   └── munge.pc
│   └── systemd
│       └── system
├── sbin
│   ├── munged
│   └── mungekey
├── share
│   └── man
│       ├── man1
│       ├── man3
│       ├── man7
│       └── man8
└── var
    ├── lib
    │   └── munge
    ├── log
    │   └── munge
    └── run
        └── munge
3.3 mariadb数据库安装
# mariadbs (管理节点配置)
# 配置/etc/my.cnf文件中[mysqld]增加如下配置
innodb_buffer_pool_size=1024M
# 设置InnoDB存储引擎缓存池大小
# show global variables like 'innodb_buffer_pool_size';
innodb_log_file_size=512M
# 配置的Redo空间越大,InnoDB就能更好的优化写操作;然而,增大Redo空间也意味着更长的恢复时间当出现崩溃或掉电等意外时。
# show variables like 'innodb_log_file_size'; 
innodb_lock_wait_timeout=900

注意! 上面的配置数值是根据自己实际硬件配置而设定的,硬件配置越高数值越高。

# mariadb数据库所在的服务器,本篇中就是管理节点(管理节点安装)
systemc start mariadb
# 启动mariadb服务

mysql -uroot
# 新安装的mariadb数据库是没有密码的,需要自己设置

SET password for 'root'@'LDD-HPC'=password('MySetPassdWord');
# LDD-HPC为自己的主机名,MySetPassdWord为自己设置新密码

mysql -uroot -p
# 重新利用新密码登录

create user 'slurm'@'LDD-HPC' identified by 'MySetPassdWord';
# 生成slurm用户,以便该用户操作slurm_acct_db数据库,其密码是自己设置的密码

create database slurm_acct_db;
# 生成账户数据库slurm_acct_db

grant all on slurm_acct_db.* TO 'slurm'@'LDD-HPC' identified by 'MySetPassdWord' with grant option;
# 赋予slurm从本机LDD-HPC采用密码,登录具备操作slurm_acct_db数据下所有表的全部权限

create database slurm_jobcomp_db;
# 生成作业信息数据库slurm_jobcomp_db

grant all on slurm_jobcomp_db.* TO 'slurm'@'LDD-HPC' identified by 'MySetPassdWord' with grant option;
# 赋予slurm从本机LDD-HPC采用密码,登录具备操作slurm_jobcomp_db数据下所有表的全部权限

flush privileges;
# 立即刷新权限

show databases;
# 显示当前的数据库信息

show grants for slurm@'LDD-HPC';
# 显示slurm用户下数据库信息
3.4 pmix3/pmix4并行插件安装
# 为了增加slurm并行的适配行,两个版本都安装(管理节点安装)
# 软件版本:openpmix-3.2.3.tar.gz  
tar -zxf openpmix-3.2.3.tar.gz
cd openpmix-3.2.3
./autogen.pl
./configure --prefix=/opt/hpc/slurm/pmix/pmix-3.2.3
make
make install

# 软件版本:openpmix-4.2.2.tar.gz
tar -zxf openpmix-4.2.2.tar.gz
cd openpmix-4.2.2
./autogen.pl
./configure --prefix=/opt/hpc/slurm/pmix/pmix-4.2.2
make 
make install
四、★ slurm主程序编译安装

4.1 管理/登录/数据库节点slurm账号建立
# 管理节点创建slurm账号
useradd -M  -s /sbin/nologin -u 601  slurm
groupmod  -g 601 slurm

# 计算节点创建slurm账号
# pdsh命令方式
pdsh -w node[10-20] "useradd -M -s /sbin/nologin -u 601 slurm;groupmod -g 601 slurm"

# for...in...do命令方式
for i in `seq 10 20`;do ssh node$i "useradd -M -s /sbin/nologin -u 601 slurm;groupmod -g 601 slurm";done
4.2 管理/登录/数据库节点slurm安装
# 软件版本:slurm-23.02.1.tar.bz2
# 管理节点配置
tar -xf slurm-23.02.1.tar.bz2
cd slurm-23.02.1/
./configure --prefix=/opt/hpc/slurm/slurm-23.02.1 \
--sysconfdir=/opt/hpc/slurm/slurm-23.02.1/etc \
--localstatedir=/opt/hpc/slurm/slurm-23.02.1/var \
--runstatedir=/opt/hpc/slurm/slurm-23.02.1/var/run \
--with-munge=/opt/hpc/slurm/munge-0.5.15 \
--with-pmix=/opt/hpc/slurm/pmix/pmix-3.2.3:/opt/hpc/slurm/pmix/pmix-4.2.2 \
--enable-pam \
--with-hdf5=yes
make -j 4
make install

# 安装pmi2并行协议
cd contribs/pmi2
make  install

# 安装pam认证协议
cd contribs/pam_slurm_adopt/
make
make install

# 计算节点配置
## 还是在管理节点把安装好的文件传输给每个计算节点
### pdsh命令方式
pdsh -w node[10-20] "mkdir -p /opt/hpc/slurm"
pdcp -r -w node[10-20] /opt/hpc/slurm/slurm-23.02.1  /opt/hpc/slurm/

### for...in...do命令方式
for i in `seq 10 20`;do ssh node$i "mkdir -p /opt/hpc/slurm";done
for i in `seq 10 20`;do scp -r /opt/hpc/slurm/slurm-23.02.1 node$i:/opt/hpc/slurm;done

## 传输pam插件配置文件(为下面pam配置做准备,如果不配置可以不运行以下命令)
#### pdsh命令方式
pdcp -w node[10-20] /lib64/security/pam_slurm_adopt.* /lib64/security

#### for...in...do
for i in `seq 10 20`;do scp -r /lib64/security/pam_slurm_adopt.* node$i:/lib64/security;done

# 创建slurm配置目录和文件(管理节点配置)
mkdir /opt/hpc/slurm/slurm-23.02.1/etc
mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/{log,run,spool}
mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/log/slurm
touch /opt/hpc/slurm/slurm-23.02.1/var/log/slurm/{slurmctld.log,slurmd.log}
mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/spool/{slurmctld,slurmd}
chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/var/spool/slurmctld

# 复制slurm配置文件(管理节点配置)
sudo cp slurm.conf.example /opt/hpc/slurm/slurm-23.02.1/etc/slurm.conf
sudo cp slurmdbd.conf.example /opt/hpc/slurm/slurm-23.02.1/etc/slurmdbd.conf
sudo cp cgroup.conf.example /opt/hpc/slurm/slurm-23.02.1/etc/cgroup.conf

# 修改slurm配置文件属性(管理节点配置)
# slurmdbd.conf文件所有者须为slurm用户,文件权限须为600:
chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/etc/slurmdbd.conf
chmod 600 /opt/hpc/slurm/slurm-23.02.1/etc/slurmdbd.conf
chown root /opt/hpc/slurm/slurm-23.02.1/etc/slurm.conf
chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/var/log/slurm/
chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/var/spool/slurmctld
chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/var/spool/slurmd

# 计算节点slurm配置文件及属性配置
pdsh -w node[10-20] "mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/{log,run,spool};mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/log/slurm"
pdsh -w node[10-20] "touch /opt/hpc/slurm/slurm-23.02.1/var/log/slurm/slurmd.log;mkdir -p /opt/hpc/slurm/slurm-23.02.1/var/spool/slurmd;chown slurm.slurm /opt/hpc/slurm/slurm-23.02.1/var/spool/slurmd/"
# 配置slurmctlld slurmdbd slurmd启动文件(管理节点)
sudo cp slurmctld.service  slurmdbd.service  slurmd.service /usr/lib/systemd/system

注意! slurmctld.service slurmdbd.service slurmd.service启动配置文件的位置是在源码安装包内/etc目录里,编译安装后并不会自动安装到指定目录下,需要自己手动复制到/usr/lib/systemd/system启动目录下。

4.3 slurm.conf主配置文件
# 配置slurm.conf文件(管理节点)
# scontrol reconfig 启动后修改此配置文件需要重新输入命令进行更新
# Cluster Name:集群名
ClusterName=LDD-INSPUR # 集群名,任意英文和数字名字

# Control Machines:Slurmctld控制进程节点
SlurmctldHost=LDD-HPC # 启动slurmctld进程的节点名
# 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=/opt/hpc/slurm/slurm-23.02.1/var/spool/slurmctld 
    # 存储管理节点slurmctld服务状态的目录,如有备份控制节点,则需要所有SlurmctldHost节点都能共享读写该目录
SlurmdSpoolDir=/opt/hpc/slurm/slurm-23.02.1/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及其它可追踪资源作为可消费资源(消费及分配),建议设置
# 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_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查看帮助)
         
# Event Logging:事件记录
# Slurmctld和slurmd守护进程可以配置为采用不同级别的详细度记录,从0(不记录)到7(极度详细)
SlurmctldDebug=info # 默认为info
SlurmctldLogFile=/opt/hpc/slurm/slurm-23.02.1/var/log/slurm/slurmctld.log 
    # 如是空白,则记录到syslog
SlurmdDebug=info # 默认为info
SlurmdLogFile=/opt/hpc/slurm/slurm-23.02.1/var/log/slurm/slurmd.log 
    # 如为空白,则记录到syslog,如名字中的有字符串"%h",则"%h"将被替换为节点名

# Job Completion Logging:作业完成记录
JobCompType=jobcomp/mysql
# 设定数据库在哪里运行,且如何连接
JobCompHost=LDD-HPC 
    # 存储作业完成信息的数据库主机名
# JobCompPort= 
    # 存储作业完成信息的数据库服务器监听端口
JobCompUser=slurm 
    # 用于与存储作业完成信息数据库进行对话的用户名
JobCompPass=MySetPassdWord 
    # 用于与存储作业完成信息数据库进行对话的用户密码

# Job Accounting Gather:作业记账收集
JobAcctGatherType=jobacct_gather/linux 

# 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=LDD-HPC # 记账数据库主机名
# AccountingStoragePort= 
    # 记账数据库服务监听端口
# AccountingStorageUser=slurm 
    # 记账数据库用户名
# AccountingStoragePass=MySetPassdWord 
    # 记账数据库用户密码。对于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=/opt/hpc/slurm/slurm-23.02.1/var/run/slurmctld.pid 
    # 存储slurmctld进程号PID的文件
 SlurmdPidFile=/opt/hpc/slurm/slurm-23.02.1/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=LDD-HPC NodeAddr=193.168.1.195 CPUs=8 RealMemory=16045 Sockets=1 CoresPerSocket=8 ThreadsPerCore=1 State=UNKNOWN
NodeName=node01 NodeAddr=193.168.1.42 CPUs=8 RealMemory=16045 Sockets=1 CoresPerSocket=8 ThreadsPerCore=1 State=UNKNOWN
# NodeName=node[10-20] NodeAddr=10.110.100.[10-20] CPUs=192 RealMemory=128581 Sockets=2 CoresPerSocket=48 ThreadsPerCore=2 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[]参数,将关联到一个与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=master Nodes=LDD-HPC Default=NO MaxTime=INFINITE State=UP
PartitionName=compute Nodes=node[10-20] Default=YES MaxTime=INFINITE State=UP
# PartitionName=batch Nodes=node[1-10] 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
4.4 cgroup.conf文件配置
# 配置cgroup.conf(管理节点配置)
# 启用cgroup资源限制,可以防止用户实际使用的资源超过用户为该作业通过作业调度系统申请到的资源。
# 如不设定,注释掉在 /etc/slurm/slurm.conf中 ProctrackType=proctrack/cgroup 及 TaskPlugin=task/cgroup 参数。
# 如需要设定,打开/etc/slurm/slurm.conf中 ProctrackType=proctrack/cgroup 和 TaskPlugin=task/cgroup 参数,
# 还需要设定 /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 
# Cgroup自动挂载。Slurm cgroup插件需要挂载有效且功能正常的cgroup子系统于 /sys/fs/cgroup/
# 当启动时,插件检查该子系统是否可用。如不可用,该插件将启动失败,直到CgroupAutomount设置为yes。
# 在此情形侠,插件首先尝试挂载所需的子系统。
CgroupMountpoint=/sys/fs/cgroup 
# 设置cgroup挂载点,该目录应该是可写的,可以含有每个子系统挂载的cgroups。默认在/sys/fs/cgroup。
# CgroupPlugin= 
# 设置与cgroup子系统交互采用的插件。其值可以为cgroup/v1(支持传统的cgroup v1接口)或autodetect(根据系统提供的cgroup版本自动选择)。
#默认为autodetect。

ConstrainCores=yes 
# 如设为yes,则容器允许将CPU核作为可分配资源子集,该项功能使用cpuset子系统。由于HWLOC 1.11.5版本中修复的错误,
# 除了task/cgroup外,可能还需要task/affinity插件才能正常运行。默认为no。
ConstrainDevices=yes 
# 如设为yes,则容器允许将基于GRES的设备作为可分配资源,这使用设备子系统。默认为no。
ConstrainRAMSpace=yes 
# 如设为yes,则通过将内存软限制设置为分配的内存,并将硬限制设置为分配的内存AllowedRAMSpace来限制作业的内存使用。
# 默认值为no,在这种情况下,如ConstrainSwapSpace设为“yes”,则作业的内存限制将设置为其交换空间(SWAP)限制。
#注意:在使用ConstrainRAMSpace时,如果一个作业步中所有进程使用的总内存大于限制,那么内核将触发内存不足(Out Of Memory,OOM)事件,
# 将杀死作业步中的一个或多个进程。作业步状态将被标记为OOM,但作业步本身将继续运行,作业步中的其它进程也可能继续运行。
4.5 slurmdb.conf文件配置
# 配置slurmdbd.conf (管理节点配置)

# 认证信息
AuthType=auth/munge 
    # 认证方式,该处采用munge进行认证
AuthInfo=/opt/hpc/slurm/munge-0.5.15/var/run/munge/munge.socket.2 
    # 为了与slurmctld控制节点通信的其它认证信息

# slurmDBD信息
DbdHost=LDD-HPC # 数据库节点名
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=/opt/hpc/slurm/slurm-23.02.1/var/log/slurm/slurmdbd.log 
	# slurmdbd守护进程日志文件绝对路径
PidFile=/opt/hpc/slurm/slurm-23.02.1/var/run/slurmdbd.pid 
	# slurmdbd守护进程存储进程号文件绝对路径
PrivateData=accounts,events,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=LDD-HPC # 存储数据库节点名
StorageLoc=slurm_acct_db # 存储位置
StoragePort=3306 # 存储数据库服务端口号
StorageUser=slurm # 存储数据库用户名
StoragePass=MySetPassdWord # 存储数据库密码
4.6 计算节点启动文件配置
# 增加 --conf-server LDD-HPC:6817设定slurmctld管理服务器主机名
vim slurmd.service
[Unit]
Description=Slurm node daemon
After=munge.service network-online.target remote-fs.target
Wants=network-online.target
#ConditionPathExists=/opt/hpc/slurm/slurm-23.02.1/etc/slurm.conf

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/slurmd
EnvironmentFile=-/etc/default/slurmd
ExecStart=/opt/hpc/slurm/slurm-23.02.1/sbin/slurmd --conf-server LDD-HPC:6817 -D -s $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
LimitNOFILE=131072
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes


# Uncomment the following lines to disable logging through journald.
# NOTE: It may be preferable to set these through an override file instead.
#StandardOutput=null
#StandardError=null

[Install]
WantedBy=multi-user.target
# 将该文件复制到各节点:
# pdsh命令方式
sudo pdcp -w node[10-20] slurmd.service /lib/systemd/system/

#for...in...do命令方式
for i in `seq 10 20`;do ssh node$i "slurmd.service /lib/systemd/system/"
# 启动各计算节点slurmd服务
sudo pdsh -w node[10-20]  "systemctl daemon-reload; systemctl enable --now slurmd"

##for...in...do命令方式
for i in `seq 10 20`;do ssh node$i "systemctl daemon-reload; systemctl enable --now slurmd"
4.7 启动slurm及相关服务
# 设置服务开机启动,且现在就开始启动

# 管理节点
systemctl restart munge
systemctl enable --now mariadb
systemctl enable --now slurmdbd
systemctl enable --now slurmctld

# 计算节点
systemctl restart munge
systemctl enalbe --now slurmd
4.8 pam插件安装(可选)

slurm可以通过pam插件限制普通用户随意登录计算节点,只有通过srun sbatch salloc命令提交到了作业后才可以进入计算节点,如果选择配置,那么在4.2节slurm安装的时候就需要运行配置pam插件命令

管理节点:主要配置文件 slurm.conf cgroup.conf

计算节点:主要配置文件/etc/pam.d/sshd /etc/pam.d/system-auth /etc/pam.d/password-auth

# slurm.conf 增加如下三个参数,如果已有就忽略(管理节点)
PrologFlags=CONTAIN
TaskPlugin=task/cgroup
ProctrackType=proctrack/cgroup
# cgroup.conf 增加如下二个参数,如果已有就忽略(管理节点)
CgroupAutomount=yes
ConstrainCores=yes
# 刷新slurm.conf配置
scontrol reconfig
# /etc/pam.d/sshd 配置内容(计算节点)
#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
account    sufficient   pam_listfile.so item=user sense=allow file=/etc/ssh/allowed_users onerr=fail #(新增)
account    required     pam_slurm.so #(新增)
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare
# pdsh 命令方式
pdsh -w node[10-20] 'echo -e "#slurm\naccount    sufficient   pam_listfile.so item=user sense=allow file=/etc/ssh/allowed_users onerr=fail" >> /etc/pam.d/sshd'
pdsh -w node[10-20] 'echo -e "account    required     pam_slurm_adopt.so" >> /etc/pam.d/sshd'

#for...in...do命令方式
for i in `seq 10 20`;do ssh node$i 'echo -e "#slurm\naccount    sufficient   pam_listfile.so item=user sense=allow file=/etc/ssh/allowed_users onerr=fail" >> /etc/pam.d/sshd';done
for i in `seq 10 20`;do ssh node$i 'echo -e "account    required     pam_slurm_adopt.so" >> /etc/pam.d/sshd';done
# /etc/pam.d/system-auth 配置内容(计算节点)
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
#account     sufficient    pam_localuser.so (注释)
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
#-session     optional      pam_systemd.so (注释)
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

# pdsh 命令方式
pdsh -w node[10-20] "sed -i 's/account*.*pam_localuser.so/#account     sufficient    pam_localuser.so/g' /etc/pam.d/system-auth"
pdsh -w node[10-20] "sed -i 's/-*.*pam_systemd.so/#-session     optional      pam_systemd.so/g' /etc/pam.d/system-auth"

#for...in..do命令方式
for i in `seq 10 20`;do ssh node$i "sed -i 's/account*.*pam_localuser.so/#account     sufficient    pam_localuser.so/g' /etc/pam.d/system-auth";done
for i in `seq 10 20`;do ssh node$i "sed -i 's/-*.*pam_systemd.so/#-session     optional      pam_systemd.so/g' /etc/pam.d/system-auth";done
# /etc/pam.d/password-auth 配置内容(计算节点)
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
#account     sufficient    pam_localuser.so (注释)
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok


password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
#-session     optional      pam_systemd.so (注释)
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

# pdsh 命令方式
pdsh -w node[10-20] "sed -i 's/account*.*pam_localuser.so/#account     sufficient    pam_localuser.so/g' /etc/pam.d/password-auth"
pdsh -w node[10-20] "sed -i 's/-*.*pam_systemd.so/#-session     optional      pam_systemd.so/g' /etc/pam.d/password-auth"

#for...in..do命令方式
for i in `seq 10 20`;do ssh node$i "sed -i 's/account*.*pam_localuser.so/#account     sufficient    pam_localuser.so/g' /etc/pam.d/password-auth";done
for i in `seq 10 20`;do ssh node$i "sed -i 's/-*.*pam_systemd.so/#-session     optional      pam_systemd.so/g' /etc/pam.d/password-auth";done
# 创建无作业可登录计算节点白名单
# 把允许登录计算节点的用户名写入各计算节点/etc/ssh/allowed_users文件中
## pdsh 命令方式
pdsh -w node[10-20] "touch /etc/ssh/allowed_users;chmod 600 /etc/ssh/allowed_users"
sudo pdsh -w node[10-20] "echo -e `whoami` >> /etc/ssh/allowed_users"

#for...in..do命令方式
for i in `seq 10 20`;do ssh node$i "touch /etc/ssh/allowed_users;chmod 600 /etc/ssh/allowed_users";done
for i in `seq 10 20`;do ssh node$i "echo -e `whoami` >> /etc/ssh/allowed_users";done
# 重启各计算节点sshd服务
## pdsh命令方式
pdsh -w node[10-20] "systemctl restart sshd"

#for...in..do命令方式
for i in `seq 10 20`;do ssh node$i "systemctl restart sshd";done
五、★ slurm基本命令

5.1 sinfo 查看集群状态

sinfo -l 查看队列信息

sinfo -N 查看节点信息

节点状态包括:

drain(节点故障),alloc(节点在用),idle(节点可用),down(节点下线),mix(节点部分占用,但仍有剩余资源)。

5.2 squeue 查看作业信息

squeue -j 52 查看特定作业号信息

squeue -l 查看当前作业信息

作业状态包括R(正在运行),PD(正在排队),CG(即将完成),CD(已完成)。

默认情况下,squeue只会展示在排队或在运行的作业。

5.3 sbatch 作业脚本提交

准备作业脚本然后通过sbatch提交是 Slurm 的最常见用法。 为了将作业脚本提交给作业系统,Slurm 使用 sbatch test.slurm

#sbatch 作业脚本示例
#!/bin/bash
### 输入申请资源信息
#SBATCH --job-name=ping
#SBATCH -p compute
#SBATCH -N 2
#SBATCH -n 4
#SBATCH --ntasks-per-node=2
#SBATCH --time=00:02:00
#SBATCH --output=%j.out
#SBATCH --error=%j.err

### 输入当前作业所需环境
module load xxxx/xxxx

### 输入作业提交命令及相关输出信息
echo LDD-INSPUR JOB_ID:${SLURM_JOB_ID}
echo LDD-INSPUR JOB_NAME:${SLURM_JOB_NAME}
echo LDD-INSPUR SQUEUE_NAME:${SLURM_JOB_PARTITION}
echo LDD-INSPUR COMPUTE_NODE_LIST:${SLURM_JOB_NODELIST}
echo LDD-INSPUR COMPUTE_NODE_NUMS:${SLURM_JOB_NUM_NODES}
echo LDD-INSPUR NTASKS_NUMS:${SLURM_NTASKS}
echo LDD-INSPUR JOB_DIR:${SLURM_SUBMIT_DIR}
echo LDD-INSPUR JOB_HOSTNAME:${SLURM_SUBMIT_HOST}
echo ${SLURM_JOB_NAME}_start_on:$(date)
ping -c 50 node10
echo ${SLURM_JOB_NAME}_end_on:$(date)
5.4 scontrol 节点状态信息
# 查看计算节点信息
scontrol show node node10

# 查看分区信息
scontrol show partition

# 重启计算节点状态信息
scontrol update nodename=node10 state=resume

# 设置计算节点状态
scontrol update nodename=node10 state=down reason='memory bad'

# 挂起作业号21
scontrol hold 21

# 重新释放被挂起的作业
scontrol release 21

# 添加作业依赖,以便在前面作业号完成后才开始运行
scontrol update dependency=21

5.5 sacct 完成作业信息
# 此命令需要root权限
# 显示过去24小时作业信息
sacct

# 查看更多信息
sacct --format=jobid,jobname,partition,account,user,ntasks,alloccpus,elapsed,state,exitcode -j 36

# 查看平均作业内存消耗和最大内存消耗
sacct --format="jobid,averss,maxrss" -j 36

# 查看指定时间内的已完成的作业信息
sacct -S 2023-02-02 -E now -u ldd
六、★ slurm提交并行作业

6.1 sbatch提交并行计算脚本

注意! 本脚本需要运行的集群安装控制环境软件module,并且运行软件的求解器不需要界面模式就可以运行

#!/bin/bash
### 输入计算资源信息
#SBATCH --job-name=test
#SBATCH -p Compute-Node
#SBATCH -N 2
#SBATCH -n 8
#SBATCH --ntasks-per-node=4
#SBATCH --chdir=/xxx/xxxx/xxx
#SBATCH --output=%4j_%u.out
#SBATCH --error=%4j_%u.err

### 输入当前作业所需环境
### module load xxx/xxx
module load mpich4/4.1.1
ulimit -s unlimited
ulimit -l unlimited

### 输入作业相关输出信息
echo LDD-INSPUR JOB_ID:${SLURM_JOB_ID}
echo LDD-INSPUR JOB_NAME:${SLURM_JOB_NAME}
echo LDD-INSPUR SQUEUE_NAME:${SLURM_JOB_PARTITION}
echo LDD-INSPUR COMPUTE_NODE_LIST:${SLURM_JOB_NODELIST}
echo LDD-INSPUR COMPUTE_NODE_NUMS:${SLURM_JOB_NUM_NODES}
echo LDD-INSPUR NTASKS_NUMS:${SLURM_NTASKS}
echo LDD-INSPUR JOB_DIR:${SLURM_SUBMIT_DIR}
echo LDD-INSPUR JOB_HOSTNAME:${SLURM_SUBMIT_HOST}
echo ${SLURM_JOB_NAME}_start_on:$(date)

### 输入作业提交命令
# export OMP_MUM_THREADS=8
mpirun ./xxxxxx
echo ${SLURM_JOB_NAME}_end_on:$(date)
6.2 sbatch 提交star-ccm+脚本
#!/bin/bash
### 输入计算资源信息
#SBATCH --job-name=star-ccm+
#SBATCH -p Compute-Node
#SBATCH -N 2
#SBATCH -n 96
#SBATCH --ntasks-per-node=48
#SBATCH --chdir=/xxx/xxxx/xxx
#SBATCH --output=%4j_%u.out
#SBATCH --error=%4j_%u.err

### 输入当前作业所需环境
### module load xxx/xxx
module load starccm+/2022
module load intel/2020
ulimit -s unlimited
ulimit -l unlimited

### 输入作业相关输出信息
echo LDD-INSPUR JOB_ID:${SLURM_JOB_ID}
echo LDD-INSPUR JOB_NAME:${SLURM_JOB_NAME}
echo LDD-INSPUR SQUEUE_NAME:${SLURM_JOB_PARTITION}
echo LDD-INSPUR COMPUTE_NODE_LIST:${SLURM_JOB_NODELIST}
echo LDD-INSPUR COMPUTE_NODE_NUMS:${SLURM_JOB_NUM_NODES}
echo LDD-INSPUR NTASKS_NUMS:${SLURM_NTASKS}
echo LDD-INSPUR JOB_DIR:${SLURM_SUBMIT_DIR}
echo LDD-INSPUR JOB_HOSTNAME:${SLURM_SUBMIT_HOST}
echo ${SLURM_JOB_NAME}_start_on:$(date)

### 输入作业提交命令
cat /dev/null > hostfiles
scontrol show hostname $SLURM_JOB_NODELIST > hostfiles
starccm+ -power -machinefile './hostfiles' -np $SLURM_NTASKS -rsh ssh -cpubind -batch run -batch-report xxxx.sim
echo ${SLURM_JOB_NAME}_end_on:$(date)
七、最后

以上内容都是经过实战验证过的,由于配置环境是集群且离线安装,所以过程有些复杂,命令过于多,请仔细查看和复制命令以免照成不必要的错误。

(●’◡’●)最后感谢屏幕另一端的你,强有力的支持。

你可能感兴趣的:(HPC集群及相关软硬件适配,数据库,linux,服务器,centos)