slurm集群部署安装
前期节点准备,三个节点,一个管理节点(也是部署节点),两个计算节点
1、最小化安装centos7,注意python环境就用默认的2.7就行
2、安装git,只在管理/部署节点安装
yum -y install git
ssh-keygen -t rsa -C "起个SSH名字"
//密钥放到gitee
自动化部署slurm仓库地址:
https://gitee.com/wanghuiic/demo-ansible#%E9%83%A8%E7%BD%B2
3、修改主机名
hostnamectl 查看主机名
hostnamectl set-hostname (跟着自己的主机名)
4、SSH互信,注意奥:如果部署节点就是对应的slurm控制节点的时候,需要自己给自己SSH互信,
ssh-keygen -t rsa 一路回车,每个节点都要搞
//在管理节点使用
ssh-copy-id (hostIP 或者在/etc/hosts定义好IP地址与hostname的映射)
ssh-copy-id master ##自己给自己搞SSH互信
5、执行make命令出错,所以在之前先安装virtualenv
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
//豆瓣家的就是快
pip install virtualenv -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple
6、执行make,然后make install,make之后可能下载速度忒慢了
修改build.sh install.sh 中关于使用pip命令下载的方式
后面都加上-i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple
或者说,在centos7系统里面修改pip镜像源
7、使用make, make install,还有make test,关联文件
build.sh install.sh test.sh
8、修改global.yml
slurmdbd_database_address slurmdbd数据库服务器IP地址,注意修改为master地址
[mariadb] [slurmservers] [slurmdbdservers] [slurmrestservers] 都用一个节点
9、修改multinode
[mariadb:vars]
db_interface=ens33 --网卡为自己系统的网卡型号
db_address_family="ipv4"
[slurm:vars]
network_interface=ens33 --网卡为自己系统的网卡型号
enable_slurm=yes
------以上两处都需要修改
ip address //查询网卡型号
10、passwords.yml存放的是MySQL密码,以及slurmdbd密码
11、打开端口
stcp 6817 slurmctld
tcp 6818 slurmd
tcp 6819 slurmdbd
tcp 6820 slurmrestd
tcp 3306 mysqld
firewall-cmd --zone=public --add-port=8000/tcp --permanent ##打开8000端口命令
firewall-cmd --zone=public --remove-port=8000/tcp --permanent
firewall-cmd --reload ##配置立刻生效
firewall-cmd --permanent --query-port=80/tcp ##查看80端口有没开放
firewall-cmd --state ##查看防火墙状态,是否是running
systemctl status firewalld.service ##查看防火墙状态
systemctl start firewalld.service ##启动防火墙
systemctl stop firewalld.service ##临时关闭防火墙
systemctl enable firewalld.service ##设置开机启动防火墙
systemctl disable firewalld.service ##设置禁止开机启动防火墙
firewall-cmd --list-ports ##查看以及生效的端口
12、创建用户,所有节点,并授权
adduser slurmtest01
adduser slurmtest02
//查看授权用户
ll /etc/sudoers
chmod u+w /etc/sudoers
//添加格式
slurmtest01 ALL=(ALL) NOPASSWD: ALL
chmod u-w /etc/sudoers
13、执行部署命令
./test.sh slurmtest -vvv ##执行之后能看到细节问题,不加--vvv看不到细节问题
./test.sh slurmtest 简化版部署方案
14、执行srun -N-99999 hostname
命令,不报错说明成功了
15、测试一下使用MPI demo与 OpenMP demo测试
16、 当使用sinfo
查看节点状态为unknow/unk*的时候,重置节点状态
[root@master demo-ansible]# scontrol update nodename=node2 state=DOWN reason=hung_completing
[root@master demo-ansible]# scontrol update nodename=node2 state=RESUME
17、出现以下问题,Job allocation 9 has been revoked
可能是munge密钥的问题
-----------问题-----------------
[root@ltw ~]# srun -n2 -l hostname
srun: Required node not available (down, drained or reserved)
srun: job 9 queued and waiting for resources
^Csrun: Job allocation 9 has been revoked
srun: Force Terminated job 9
-----------解决办法-------------
//接着执行,可能会出错
systemctl disable --now NetworkManager NetworkManager-wait-online NetworkManager-dispatcher dbus-org.freedesktop.NetworkManager
[root@master ~]# scp /etc/munge/munge.key node1:/etc/munge/
[root@master ~]# scp /etc/munge/munge.key node2:/etc/munge/
[root@node1 ~]# systemctl restart munge
[root@node2 ~]# systemctl restart munge
出现问题sbatch提交作业之后出作业为PD模式
scontrol show node ##查看节点状态
cat /var/log/slurm/slurmctld.log | tail -n 20 ##查看报错信息
如果是批处理文件,对应的批处理脚本可能不对
18、作业应该拷贝到同样的节点一份,这样才能保证执行的通过,否则就会出现计算节点没有相应执行文件
19、为什么有的作业执行有了结果,但是sacct
显示失败了?
确实是失败了,可以查看
sacct
查看对应的结果,failed说明batch脚本运行有问题,可以查看批处理作业输出的文件
/var/spool/slurm/slurmd/job00019/slurm_script: line 11: module: command not found
/var/spool/slurm/slurmd/job00019/slurm_script: line 12: module: command not found
/var/spool/slurm/slurmd/job00019/slurm_script: line 15: mpicc: command not found
slurmstepd: error: execve(): hello.mpi: No such file or directory
slurmstepd: error: execve(): hello.mpi: No such file or directory
srun: error: node1: tasks 0-1: Exited with exit code 2
有两个问题,一个是module没安装,这里需要安装environment-modules ,直接yum -y install environment-modules
即可,execve()少了个头文件<unistd.h>,真不应该。
20、environment-modules安装使用介绍
为什么使用?
使用集群过程中,经常要安装不同的编译器和库文件,如常用的编译器有GCC,常用的 MPI并行库有OpenMPI、MPICH2等。在使用某个软件时,通常采用不同的编译设置得到不同版本的可执行程序和链接库,或者需要修改、切换不同版本的环境变量。由于程序在编译时会调用不同类型编译器或第三方库,程序之间还存在着依赖关系。导致当执行某个特定版本的程序时,修改环境变量变得十分复杂。
Environment Modules是一个简化Shell初始化的软件包,可以在使用modulefiles模块与集群进行会话期间修改模块对应的运行环境。每个模块文件都包含应用程序配置所需的信息。集群用户可共享系统上的模块文件,并且用户可以拥有自己的集合来补充或替换共享模块文件。
yum -y install environment-modules
//安装软件,之后需要重启一下终端
vim /usr/share/Modules/init/bash
# 在末尾添加
export MODULEPATH=/share/apps/Modules/modulefiles:$MODULEPATH
source /usr/share/Module/init/bash
module avail #查看当前环境下的module
修改路径,安装devtoolset
vim /usr/share/Modules/init/bash
# 在末尾添加
export MODULEPATH=/share/apps/Modules/modulefiles:$MODULEPATH
source /usr/share/Module/init/bash
yum -y install devtoolset-2
# 如果发现找不到devtoolset-2,请输入以下命令,再执行yum -y install devtoolset-2
wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
#注意:
#devtoolset目前有4个版本:devtoolset-1 devtoolset-2 devtoolset-3 devtoolset-4,
#以上版本分别对应gcc的版本为4.7、4.8、4.9、5.2
添加进去/usr/share/Modules/modulefiles/gcc/4.8.5
#%Module1.0########
proc ModulesHelp {} {
global version modroot
puts stdout "\t loads gcc 4.8.5\n"
}
module-whatis "load gcc-4.8.5"
set version 4.8.5
set prefix /share/apps/Modules
conflict gcc
setenv CC gcc
setenv CXX g++
prepend-path PATH /opt/rh/devtoolset-2/root/usr/bin
if [ module-info mode load ] {
system echo "gcc 4.8.5 is loaded"
}
if [ module-info mode switch2 ] {
system echo "gcc 4.8.5 is loaded"
}
if [ module-info mode remove ] {
system echo "gcc 4.8.5 is unloaded"
}
然后测试
module avail
#返回结果
--------------------------------------------------------------------------- /usr/share/Modules/modulefiles ----------------------------------------------------------------------------
dot gcc/4.8.5 module-git module-info modules null use.own
module load gcc/4.8.5
module unload gcc
常用的module命令如下:
- module avail:显示可以使用的模块
- module load:加载模块
- module unload:卸载模块
- module list:显示已经加载的模块
21、安装OpenMPI,MPICH
什么是MPI?
MPI是这样一种API:MPI是一套通信标准,由MPI Forum创建并维护(MPI Forum是一个开放组织,由工业、学术界的高性能计算领域的专家组成)。MPI一般作为一个消息传递的中间件,上层应用程序可以通过调用MPI接口来执行消息传递。MPI定义了一系列与平台无关的、高度抽象的API接口,用于进程之间的消息传递。比如说,进程X是发送进程,只需提供消息内容(例如一个双精度数组)以及另一个接收进程的标识(例如进程Y),同时接收进程Y只需提供发送进程的标识(例如进程X),消息就可以从X传递给Y。
- 可移植
- 高性能的IPC通信
Open-MPI 使 MPI 接口的一个开源实现。短消息传递的超低latency,短消息传递的超高网络注入率等特点。
源码安装
# 源码安装,下载openmpi-3.0.0
tar -zxvf openmpi-3.0.0.tar.gz
# 然后
cd openmpi-3.0.0/
./configure --prefix=/usr/local/openmpi
# 注意上一步可能会出错
configure: error: C++ preprocessor “/lib/cpp” fails sanity
check See `config.log’ for more details
# 先yum install glibc-headers
# 然后yum install gcc-c++
# 再./configure --prefix=/usr/local/openmpi
make && make install
修改PATH配置文件,修改后注意使用source命令使修改生效:
vim ~/.bash_profile
# 将以下两句添加到.bash_profile文件末尾位置,按Esc后:wq保存修改
export PATH=$PATH:/usr/local/openmpi/bin
export LD_LIBRARY_PATH=/usr/local/openmpi/lib
# 使用source命令激活修改:
source ~/.bash_profile
# openmpi卸载,需进入安装目录
make uninstal
想要使用module load openmpi/3.0.0还需要自己在usr/share/Modules/modulefiles/目录下添加openmpi/3.0.0文件,文件格式如下
#%Module1.0#####################################################################
##
## modulefiles/openmpi-3.0.1 Generated by EHS 1.0.0
##
proc ModulesHelp { } {
puts stderr "\tmodules - loads the modules software & application environment"
puts stderr "\n\tThis loads environment of openmpi-3.0.1"
}
module-whatis "loads the openmpi-3.0.1 environment"
prepend-path PATH ${installpath}/bin
prepend-path LD_LIBRARY_PATH ${installpath}/lib
prepend-path LIBRARY_PATH ${installpath}/lib
yum安装(推荐),好像得reboot一下
# 安装openmpi
yum install openmpi opemmpi-dev
# 安装openmpi3
yum install openmpi3 openmpi3-dev
# 推荐安装 openmpi3 ,openmpi 的版本过低。
# 也是一个MPI软件,下面四个都得下,要不然mpicc用不了
yum install mpich-3.2.x86_64
yum install mpich-3.2-autoload.x86_64
yum install mpich-3.2-devel.x86_64
yum install mpich-3.2-doc.noarch
# openmpi
module load mpi/openmpi-x86_64
# openmpi3
module load mpi/openmpi3-x86_64
# 因为自动在下面文件中就有了
cat /etc/modulefiles/mpi/openmpi3-x86_64
cat /etc/modulefiles/mpi/mpich-3.2-x86_64
22、执行多节点批处理作业时候每次都是node1节点进行处理,而不使用node2节点。
sbatch: error: Batch job submission failed: Requested node configuration is not available #批处理文件写错了
一个解释是:
批处理执行的作业被调度运行后,在所分配的首个节点上执行作业脚本。
23、关于用户、账户、预约处理等命令
-
用户操作
sacctmgr show user (withassoc) # 查看用户信息 sacctmgr add user username defaultaccount=bank01 # 添加用户并且用户所在账户为bank01 sacctmgr modify user username set QOS=normal # 修改用户信息 sacctmgr delete user username #删除用户
-
账户管理
sacctmgr show account (withassoc) # 查看账户信息 sacctmgr add account accountname # 添加账户 sacctmgr modify account accountname set Partent=root # 设置父账户为root sacctmgr delte account accountname #删除账户
-
预约处理
scontrol create reservation user=root starttime=now duration=60 nodes=node1 # 给root用户,申请预约一个从现在开始的60分钟,申请节点为node1,会生成一个预约名称,reservationname scontrol update reservationname=root_1 duration=120 #修改预约名称为root_1的用户预约时长为120分钟 scontrol show reservation # 查看预约 scontrol delete reservation=reservationname #删除预约名称为reservationname的预约
注意:
- 预约仅仅可以被root用户或配置的SlurmUser使用scontrol命令进行创建,更新,删除。
24、SlurmRestAPI 学习。