在ubuntu环境下搭建slurm集群
一、关闭防火墙以及SELinux
临时关闭SELinux setenforce 0
临时打开SELinux setenforce 1
查看SELinux的状态 getenforce
永久关闭SELinux(重启后生效)编辑/etc/selinux/config 文件,将SELinux的默认值enforcing 改为 disabled,下次开机就不会再启动
临时关闭防火墙 systemctl stop firewalld
临时打开防火墙 systemctl start firewalld
永久关闭防火墙开机自关闭 systemctl disable firewalld
防火墙开机自启动 systemctl enable firewalld
重启防火墙(disable、enable 修改后重启防火墙生效,或重启linux) systemctl restart firewalld
查看防火墙的状态 systemctl status firewalld
二、修改主机名/etc/hosts, /etc/hostname
IP配置:所有机器配置同一网段IP,最好为单独内网,与常用外网网段分开,并将所有机器IP在/etc/hosts下添加,将/etc/hosts文件分别传到每台节点。其中172网段用于nfs,192网段用于集群管理。
172.16.0.1 node1-nfs
172.16.0.2 node2-nfs
172.16.0.3 node3-nfs
172.16.0.4 node4-nfs
172.16.0.5 node5-nfs
172.16.0.6 node6-nfs
172.16.0.7 node7-nfs
172.16.0.11 control1-nfs
192.168.0.1 node1
192.168.0.2 node2
192.168.0.3 node3
192.168.0.4 node4
192.168.0.5 node5
192.168.0.6 node6
192.168.0.7 node7
192.168.0.11 control1
三、Nfs服务器搭建部署
sudo apt-get install nfs-kernel-server # 安装 NFS服务器端
sudo apt-get install nfs-common # 安装 NFS客户端
1.1在服务端:添加NFS共享目录
cat /etc/exports
/software *(insecure,rw,sync,no_root_squash)
或者:/software 172.16.0.11/24(rw,sync,no_root_squash)
1.2 启动nfs服务:/etc/init.d/nfs-kernel-server restart && systemctl enable nfs-kernel-server
可以用exportfs -rv 命令验证共享硬盘是否成功
1.3 在客户端验证并挂载:showmount -e 172.16.0.11(主节点IP) && mount -t nfs 172.16.0.11:/software /software(临时挂载)
1.4 客户端开机启动并挂载nfs: 编辑/etc/fstab文件添加如下内容:永久挂载software
172.16.0.11:/software /software nfs defaults 0 0
1.5 客户端取消挂载:取消挂载:sudo umount /software
四、NIS服务器搭建部署
1 安装nis
首先我们来安装NIS:在Ubuntu/Debian系统中,可以使用以下命令安装:
$ sudo apt install nis
这将安装NIS服务所需的所有包。
接下来,我们需要配置NIS服务。第一步是编辑/etc/default/nis文件,并确保NIS功能启用,参数NISSERVER=true:
# /etc/default/nis
# Controls the starting/stopping of ypserv & ypbind
NISSERVER=true
下一步,我们需要编辑/etc/yp.conf来配置NIS服务:
# /etc/yp.conf
domain nis.example.com server 192.168.0.1
这里,配置域名为nis.example.com,服务器地址为192.168.0.1,其中nisdomain也可以配置成你网络中的其他域名。
接下来,我们需要用以下命令从主机中建立映射到NIS服务的域:
# ypdomainname nis.example.com
修改/etc/defaultdomain文件设置域名为nis.example.com (注意:/etc/defaultdomain是一个新文件)
现在编辑/etc/nsswitch.conf,以确定我们如何使用NIS服务:
# /etc/nsswitch.conf
passwd:files [NOTFOUND=return] nis
shadow:files [NOTFOUND=return] nis
group:files [NOTFOUND=return] nis
这样NIS将会优先从/etc/passwd、/etc/shadow和/etc/group中加载帐号文件,如果没有找到,则会使用NIS服务查找。
数据初始化:(在进行数据初始化之前,需要将需要同步在集群里的账号创建完成,使用命令adduser。在这次安装中,我们需要额外使用到的账号是munge,可以使用命令 adduser munge进行账号创建)
/usr/lib/yp/ypinit -m
最后,启动NIS服务:
# service ypserv start
# service ypbind start
这样,我们就完成了Linux服务器上NIS服务的配置,在网络中其他所有服务器将可以使用NIS服务来获取统一的用户帐号信息。希望本指南能够帮助到你
二) client端的配置
1.安装NIS服务:
apt install nis
2.配置NIS域名
这里配置的域名要跟server端一样
执行如下命令:
nisdomainname nis.example.com
修改/etc/defaultdomain文件设置域名为nis.example.com
nis.example.com
3.修改/etc/default/nis文件把NISCLIENT设为true
NISSERVER=false
Are we a NIS client?
NISCLIENT=true
4.修改/etc/yp.conf文件,添加以下内容
domain nis.example.com server control1
5.修改/etc/nsswitch.conf文件,在passwd、shadow、group以及hosts行的files后面都添加上nis。
passwd: files nis
group: files nis
shadow: files nis
gshadow: files
hosts: files dns nis
6.修改完毕后,重启服务即可
sudo service ypbind restart
7.测试
sudo yptest
在主控节点外的其他节点上执行 id munge 可以得到与主控节点一样的命令输出,说明nis安装配置成功了。
五、Munge部署
1、 创建Munge用户(Munge用户要确保Master Node和Compute Nodes的UID和GID相同,所有节点都需要安装Munge):
useradd -m munge 实际执行 adduser munge
这一步骤在上一步骤中已经进行。在主控节点上创建munge用户,并通过nis服务同步至所有的计算节点。
2、 安装,每台服务器上执行: apt install munge(不管是munge服务端还是munge客户端都使用这个命令进行安装)
3、 在Master上创建密钥
create-munge-key (这一步没有执行,munge.keyi已经存在)
scp /etc/munge/munge.key root@node1:/etc/munge/ #node1 /etc/host修改对应的ip
实际执行的是 scp /etc/munge/munge.key munge@node1:/etc/munge/
4、 启动所有节点
sudo systemctl daemon-reload 重新加载配置文件
sudo systemctl restart munge 重新启动munge服务
sudo systemctl enable munge 将munge服务配置为开机自启动
5、 测试Munge服务: 每个计算节点与控制节点进行连接验证
5.1、 本地查看凭据: munge -n
5.2、本地解码: munge -n | unmunge
5.3、 验证compute node,远程解码: munge -n | ssh node01 unmunge (这一步验证不过,报错unmunge: Error: Invalid credential 重启对端munge服务即可)
6、 分别修改权限每一个节点都需要(这里需要通过id 查看munge的uid 和gid如果id不相同需要修改二者的ID(通过usermod 和groupmod)) (注意:这一步骤没有做,munge服务已经可以正常使用)
#修改目录属主
chown -R munge.munge /var/{lib,log,run}/munge
chown -R munge.munge /etc/munge
#修改目录模式
chmod 711 /var/lib/munge
chmod 700 /var/log/munge
chmod 755 /var/run/munge
chmod 700 /etc/munge
chmod 400 /etc/munge/munge.key
六、 slurm的安装步骤
Step 1. 安装依赖的软件包
- slurmd: 完成计算节点的任务(启动任务、监控任务、分层通信)
- slurmctld: 完成管理节点的任务(故障切换、资源监控、队列管理、作业调度)
$ sudo apt update
$ sudo apt install slurm-wlm
# `slurmd`: compute node daemon
$ sudo apt install slrumd (提示已安装)
# `slurmctld`: central management daemon
$ sudo apt install slurmcd'ptld (提示已安装)
Step 2. 找到slurm-wlm-configurator.html文件,进入该目录下
# 输入以下命令,并
$ dpkg -L slurmctld | grep slurm-wlm-configurator.html
/usr/share/doc/slurmctld/slurm-wlm-configurator.html
$ cd /usr/share/doc/slurmctld
$ sudo chmod +r slurm-wlm-configurator.html
Step 3. 利用 web 生成配置文件
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
打开浏览器,输入 http://:8000/,进入配置页面,点击进入 slurm-wlm-configurator.html 按照自己的需求填写设置。
Cluster Name:随意起名
Control Machines:控制节点的计算机名
Compute Machines:计算机名、ip地址、分区名和任务时间限制
cpus:虚拟机直接指定虚拟cpu数量
Sockets: 物理机不指定cpus,指定cpu插槽
CoresPerSocket: 物理机每个插槽有多少core
ThreadsPerCore: 物理机每个core有多少个线程,超线程的CPU此数字为2
slurmuser:指定为root用户
Process Tracking:选择 LinuxProc: Use parent process ID records, processes can escape from Slurm control
web 生成slurm.conf
填写完毕后,点击submit,将生成的内容拷贝进 /etc/slurm/slurm.conf (slurm 的配置文件)
# 创建
$ sudo touch /etc/slurm/slurm.conf
# 将网页生成的内容 copy 进来
$ sudo vim /etc/slurm/slurm.conf
# ctrl + v
Step 4. 手动创建slurm的输出文件目录
$ sudo mkdir /var/spool/slurmd
$ sudo mkdir /var/spool/slurmctld
Step 5. 启动 slurm 服务
# 启动 slurmd, 日志文件路径为 `/var/log/slurmd.log`
$ sudo systemctl start slurmd
# 启动 slurmctld, 日志文件路径为 `/var/log/slurmctld.log`
$ sudo systemctl start slurmctld
启动后无法正常使用 slurm 的话,先查看slurmd和slurmctld的状态,打开日志查看报错。
# 查看 slurmd 的状态
$ sudo systemctl status slurmd
# 查看 slurmctld 的状态
$ sudo systemctl status slurmctld
3. slurm.conf 中几个关键 column 的填写
C1. ClusterName
集群名,随便取
C2. SlurmctldHost
管理节点的主机名
# 获取主机名
$ hostname -s
control1
C3. SlurmUser
最好 SlurmUser=root
,权限最高,填写日志文件不会由于权限问题报错
C4. 管理节点和计算节点的配置(slurm.conf的最后三行)
此处以单节点集群举例(单个节点既作为管理节点,又作为计算节点)
EnforcePartLimits=ALL
NodeName=mu01 CPUs=36 State=UNKNOWN # 本行可以通过 `slurmd -C` 获取
PartitionName=compute Nodes=mu01 Default=YES MaxTime=INFINITE State=UP # 创建一个名为compute的队列
有多少个节点,就写多少行
NodeName=master CPUs=80 Boards=1 SocketsPerBoard=2 CoresPerSocket=20 ThreadsPerCore=2 RealMemory=128549
NodeName=node1 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node2 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node3 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node4 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node5 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node6 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
NodeName=node7 CPUs=112 Boards=1 SocketsPerBoard=2 CoresPerSocket=28 ThreadsPerCore=2 RealMemory=192057
刚出厂的新机器,其内存容量可能发生减少,减少的量在几兆到几十兆之间。建议配置RealMemory参数不要顶格,例如 服务器安装了192G内存,可以配置RealMemory参数为190000。建议新采购的服务器发生计算节点发生inval故障时,优先检查内存配置情况。
可以配置队列信息
PartitionName=control Nodes=master Default=NO MaxTime=INFINITE State=UP
PartitionName=all Nodes=master,node[0-1],hnode[0-1] Default=YES MaxTime=INFINITE State=UP
PartitionName=cp Nodes=master,node[0-1] Default=NO MaxTime=INFINITE State=UP
PartitionName=hcp Nodes=hnode[0-1] Default=NO MaxTime=INFINITE State=UP
以上命令为举例说明,并非真实配置案例。
这次配置的集群,控制节点在control分区,非默认分区;其他7台计算节点分配到compute分区,为默认分区。
slurmd -C
的输出:
$ slurmd -C
NodeName=mu01 CPUs=36 Boards=1 SocketsPerBoard=1 CoresPerSocket=10 ThreadsPerCore=2 RealMemory=63962(举例说明,并非真实案例)
脚本内容111.sh
#!/bin/bash
#SBATCH -p debug
#SBATCH -J test
#SBATCH -N 1
#SBATCH -n 4
#SBATCH -o out.log
#SBATCH -e error.log
mpirun -np 4 vasp_std
作业提交命令:(在slurm安装配置完成,提交作业之前需要重启一次服务器)
sbatch -n 4 111.sh
sbatch 111.sh
作业队列:squeue
作业状态:sinfo
作业输出:tail -f out.log