参考资料
1. 安装
1.1 ubuntu环境
https://www.cnblogs.com/haiba...
https://blog.csdn.net/heguang...
1.1.0 机器准备
两台ubuntu:
主机名与IP信息如下:
master 10.0.32.80 # 主节点
node 10.0.32.159 # 计算节点
对于所有节点,配置hostname,修改本机hostname
# 临时修改主机名(主节点主机名为master,子节点主机名为node)
$ hostname master # 或者node
#永久修改主机名
$ vim /etc/hostname #修改主机名,保存文件。重启后生效。
对于所有节点,修改hosts
#打开hosts配置文件
$ vim /etc/hosts
# 插入以下几行,保存文件
10.0.32.80 master
10.0.32.159 node
1.1.1 安装munge
1.1.1.1 源码编译安装
对于所有节点,执行以下操作:
#切换root
$ sudo su
#准备环境
$ apt install gcc
$ apt install openssl
$ apt install libssl-devapt install make
#下载安装包
$ wget https://github.com/dun/munge/archive/munge-0.5.13.tar.gz
#解压
$ tar -zxf munge-0.5.13.tar.gz
#切换路径
$ cd munge-0.5.13
#编译安装
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var && make && make install
1.1.1.2 创建密钥
对于master节点,执行以下操作:
# 等待随机数据
$ dd if=/dev/random bs=1 count=1024 >/etc/munge/munge.key
1.1.1.3 新建用户
对于全部节点,执行以下操作:
#新建用户及其主目录和登录shell
$ useradd munge -m -s /bin/bash
#给用户赋密码
$ passwd munge
# 将用户添加到sudoers中
$ vim /etc/sudoers
在root ALL=(ALL:ALL) ALL行下,添加
munge ALL=(ALL:ALL) ALL
#修改目录属主
$ 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
1.1.1.4 拷贝密钥
对于master节点,执行以下操作:
#拷贝主节点密钥到其余节点
$ scp /etc/munge/munge.key munge@10.0.32.159:/etc/munge
1.1.1.5 启动守护进程
对于全部节点,执行以下操作:
#切换用户
$ su munge
#启动munge
$ /usr/sbin/munged
## 注:如果启动报错
# /usr/sbin/munged: error while loading shared libraries: libmunge.so.2: cannot open shared object file: No such file or directory,
# 则用root用户执行ldconfig
# munged: Error: Found pid 9026 bound to socket "/var/run/munge/munge.socket.2"
# 表示munged已经启动
1.1.2 安装slurm
1.1.2.1 源码编译安装
对于所有节点,执行以下操作:
#切换root
$ sudo su
$ cd ~
#下载安装包
$ wget https://download.schedmd.com/slurm/slurm-19.05.0.tar.bz2
#解压
$ tar -xaf slurm*tar.bz2
#切换路径
$ cd slurm-19.05.0
#编译安装
$ ./configure --enable-debug --prefix=/opt/slurm --sysconfdir=/opt/slurm/etc
$ make && make install
在编译过程中可能会出现的错误:/usr/bin/env:"python":没有那个文件或目录
解决办法:
#添加软链
$ ln -s /usr/bin/python3 /usr/bin/python
1.1.2.2 新建用户
对于全部节点,执行以下操作:
(使用slurm,所有的节点必须在相同的用户下工作,建议新建一个slurm用户,必须指定UID,保证所有节点slurm用户的UID也相同)
#新建用户及其主目录和登录shell
$ useradd slurm -m -s /bin/bash
#给用户赋密码
$ passwd slurm
#新建所需文件夹
$ mkdir /opt/slurm/log
$ mkdir /opt/slurm/spool
$ mkdir /opt/slurm/spool/slurm
$ mkdir /opt/slurm/run
#修改目录属主
$ chown -R slurm:slurm /opt/slurm
1.1.2.3 配置主节点
对于master节点,执行以下操作:
#从源码包拷贝配置文件夹
$ cp -r ~/slurm-19.05.0/etc/ /opt/slurm/etc/
#修改目录属主
$ chown -R slurm:slurm /opt/slurm/etc
#拷贝配置文件实例
$ cp /opt/slurm/etc/slurm.conf.example /opt/slurm/etc/slurm.conf
#打开配置文件进行编辑
$ vim /opt/slurm/etc/slurm.conf
配置文件:
#
# Example slurm.conf file. Please run configurator.html
# (in doc/html) to build a configuration file customized
# for your environment.
#
#
# slurm.conf file generated by configurator.html.
#
# See the slurm.conf man page for more information.
#
ClusterName=linux # 集群名称
ControlMachine=master # 主节点名
ControlAddr=10.0.32.80 # 主节点地址,局域网
#BackupController=
#BackupAddr=
#
SlurmUser=slurm # 主节点管理账号
#SlurmdUser=root
SlurmctldPort=6817 # 主节点服务默认端口号
SlurmdPort=6818 # 子节点服务默认端口号
AuthType=auth/munge # 组件间认证授权通信方式,使用munge
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
StateSaveLocation=/opt/slurm/spool/slurm/ctld #记录主节点状态的文件夹
SlurmdSpoolDir=/opt/slurm/spool/slurm/d #子节点状态信息文件
SwitchType=switch/none
MpiDefault=none
SlurmctldPidFile=/opt/slurm/run/slurmctld.pid # 主服务进程文件
SlurmdPidFile=/opt/slurm/run/slurmd.pid # 子节点进程文件
ProctrackType=proctrack/pgid # 监控任务与进程间的关系
#PluginDir=
#FirstJobId=
ReturnToService=0
#MaxJobCount=
#PlugStackConfig=
#PropagatePrioProcess=
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#Prolog=
#Epilog=
#SrunProlog=
#SrunEpilog=
#TaskProlog=
#TaskEpilog=
#TaskPlugin=
#TrackWCKey=no
#TreeWidth=50
#TmpFS=
#UsePAM=
#
# TIMERS
SlurmctldTimeout=300
SlurmdTimeout=300
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0
#
# SCHEDULING
SchedulerType=sched/backfill
#SchedulerAuth=
#SelectType=select/linear
FastSchedule=1
#PriorityType=priority/multifactor
#PriorityDecayHalfLife=14-0
#PriorityUsageResetPeriod=14-0
#PriorityWeightFairshare=100000
#PriorityWeightAge=1000
#PriorityWeightPartition=10000
#PriorityWeightJobSize=1000
#PriorityMaxAge=1-0
#
# LOGGING
SlurmctldDebug=3
SlurmctldLogFile=/opt/slurm/log/slurmctld.log #主节点log日志
SlurmdDebug=3
SlurmdLogFile=/opt/slurm/log/slurmd.log #子节点log日志
JobCompType=jobcomp/none
#JobCompLoc=
#
# ACCOUNTING
#JobAcctGatherType=jobacct_gather/linux
#JobAcctGatherFrequency=30
#
#AccountingStorageType=accounting_storage/slurmdbd
#AccountingStorageHost=
#AccountingStorageLoc=
#AccountingStoragePass=
#AccountingStorageUser=
#
# COMPUTE NODES
#节点名称,CPUs核数,corepersocket,threadspersocket,使用lscpu查看,realmemory实际分配给slurm内存,procs是实际CPU个数,/proc/cpuinfo里查看 state=unknown是刚启动集群的时候为unknown,之后会变成idle
NodeName=master,node Procs=1 State=UNKNOWN
#partitionname是分成control和compute,default=yes是说这个用来计算,我们设置node1/2这两台default为yes,用来计算的
PartitionName=control Nodes=master Default=NO MaxTime=INFINITE State=UP
PartitionName=compute Nodes=node Default=Yes MaxTime=INFINITE State=UP
分发配置文件:
#拷贝主节点配置节点到子节点
$ scp -r /opt/slurm/etc/ slurm@10.0.32.159:/opt/slurm/
1.1.2.4 启动集群
# 主节点root用户执行
$ /opt/slurm/sbin/slurmctld -c
$ /opt/slurm/sbin/slurmd -c
# 子节点root用户执行
$ /opt/slurm/sbin/slurmd -c
1.1.2.5 验证测试
# 查看slurm管理的(partition)分区和节点的状态
$ sinfo
# 如果Compute Nodes的State=DOWN,则如下执行,将状态变成IDLE:
$ scontrol update nodename=node state=resume
# 显示全部队列信息
$ scontrol show partition
# 显示所有Compute Nodes
$ scontrol show node
# 简单测试执行
$ srun -n 1 sleep 10s
# 此时开启另一个终端,查看状态
$ squeue
# 结果如下:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
15 compute sleep root R 0:04 1 c1
# 显示作业数量
$ scontrol show jobs
注:由于每次关机,munge的相关文件会被删除,故每次开机需重新安装。以下脚本安装munge,但期间会报错,在命令行中一行一行的敲,可成功!
rm -rf munge-0.5.13
rm -rf /var/lib/munge
rm -rf /var/log/munge
rm -rf /var/run/munge
rm -rf /etc/munge
tar -zxf munge-0.5.13.tar.gz
mv munge-munge-0.5.13 munge-0.5.13
cd munge-0.5.13
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var && make && make install
if [ [$(hostname)==master] ];then
dd if=/dev/random bs=1 count=1024 >/etc/munge/munge.key
fi
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
if [ [$(hostname)==master] ];then
chmod 400 /etc/munge/munge.key
scp /etc/munge/munge.key munge@10.0.32.159:/etc/munge
fi
su munge
/usr/sbin/munged
1.2 centos环境
2. PBS命令学习
https://docs.slurm.cn/users/k...
http://www.hpc2n.umu.se/docum...
https://zhuanlan.zhihu.com/p/...
# sbatch
$ sbatch -n 2 -J yourJobName -D ./root/ sl.sh # 批量提交作业,提交作业sl.sh,– N<minnodes[maxnodes]>:设定所需要的节点数。– n:设定启动的任务数/核数
输出:Submitted batch job 26
# srun
$ srun -N 2 -J yourJobName -D ./root/ script.sh # 在"./root/"目录下用2个节点运行作业"script.sh",并指定作业名称为“yourJobName”
输出:script.sh运行的结果
# squeue
$ squeue # 查询队列中的作业,PD表示队列,R表示运行
$ squeue -u root # 查询用户root的作业
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
51 compute yourJobN root PD 0:00 1 (Resources)
49 compute yourJobN root R 0:25 1 c1
50 compute yourJobN root R 0:21 1 master
# scancel
$ scancel 25 # 取消jobID=25的作业,无输出
$ scancel 49,50,51 # 取消jobID=49,50,51的作业,无输出
# scontrol
$ scontrol show job 28 # 查看jobID=28作业的具体信息
$ scontrol update JobId=7 JobName=NewJobName # 更新作业号为7的作业名为NewJobName
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
commercial up infinite 105 drain* cn[4736-4738,4742]
commercial up infinite 1 drain cn4783
#PARTITION 分区名
#AVAIL up 表示可用 down或者inact表示不可用
#TIMELIMIT 作业运行墙上时间限制,infinite表示没有限制
#NODES 节点数
#NODELIST 节点名列表
#STATE alloc 已分配 down 宕机 drain 已失去活力 fail 失效 idel空闲
4. 概念
http://bicmr.pku.edu.cn/~wenz...
分区(Partition)详解
什么是分区,为什么要指定
不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,进而 选择最适合自己的节点进行运算。此外,如果集群中部分机器是私有的,那么设置分区 可以使得只有部分用户能在这个分区提交作业。总的来说,分区(Partition)可看做 一系列节点的集合。
QoS(Quality of Service)详解
什么是 QoS,为什么要指定
和分区不同,QoS 表示服务质量,它更多刻画了作业的属性而非节点的属性。不同任务 的特性不同,指定 QoS 可以使得资源更好分配。例如,用户若只是想简单调试自己的 程序,而非大规模地运行,那么这样的作业的特点是“短时间”,“用户对结果的需求 很迫切”。为这样的作业设计 QoS 是非常有必要的。
目前我们设计了两种 QoS,用户可根据需求自行选择。若不加指定,normal 为所有用户 的默认 QoS。
5. 配置文件
https://www.ityww.cn/1470.html
- 1、配置文件可以通过拷贝默认的模版文件来获得:slurm.conf.example
- 2、配置文件可以通过官方Web页面按需输入参数后生成来获得:https://slurm.schedmd.com/con...
3、不管通过哪种方式来获取配置文件,对于大部分参数来说保持默认即可(除非有特殊需求那就按需自定义),只有少部分参数开始就要按需配置;
#集群名称;默认为”linux”;可保持默认,按需配置; ClusterName=slurm-cluster #主控端主机名;默认”linux0″;根据Master端的实际主机名配置; ControlMachine=slurm-master #主控端IP地址;默认注释状态;当集群环境有DNS服务时可保持默认即可,如没有DNS服务时则需要根据Master端的实际IP地址配置;建议不管有无DNS服务都配置; ControlAddr=192.168.80.250 #Slurm Service服务运行专用账户;默认”slurm”;保持默认即可;表示该服务并不是以root用户或其它用户来运行管理的,而是专用账户slurm来运行管理的; SlurmUser=slurm #主控端服务(slurmctld.service)默认端口号;保持默认即可;slurctld的监听端口 SlurmctldPort=6817 #节点端服务(slurmd.service)默认端口号;保持默认即可;slurmd的通信端口 SlurmdPort=6818 #主控端与节点端之间认证授权通信方式;默认”munge”,保持默认即可; AuthType=auth/munge #主控端状态文件存放的目录路径,保持默认即可; StateSaveLocation=/var/spool/slurm/ctld #节点端状态文件存放的目录路径,保持默认即可; SlurmdSpoolDir=/var/spool/slurm/d #主控端PID文件存放的目录路径,保持默认即可; SlurmctldPidFile=/var/run/slurmctld.pid #节点端PID文件存放的目录路径,保持默认即可; SlurmdPidFile=/var/run/slurmd.pid ReturnToService=2 #避免节点端意外重启处于Down状态,默认”0″;建议”2″,重启后自动恢复成idle状态; #主控端日志文件存放的目录路径,保持默认即可; SlurmctldLogFile=/var/log/slurmctld.log #节点端日志文件存放的目录路径,保持默认即可; SlurmdLogFile=/var/log/slurmd.log #节点端的资源配置;默认值;详情见下面的节点端资源配置说明节点端资源配置说明:表示计算节点在进行计算任务时可以使用到节点的最大资源 NodeName=linux[1-32] Procs=1 State=UNKNOWN #配置节点主机名 NodeName=NodeHostName #配置对应节点的IPv4地址;当集群环境有DNS服务时此项可不配置; NodeAddr=x.x.x.x CPUs=N #N为数字;表示CPU逻辑核数(总核数); Sockets=N #N为数字;表示CPU实际物理插槽数 CoresPerSocket=N #N为数字;表示每个CPU插槽核数(每颗物理CPU核数) ThreadsPerCore=N #N为数字;表示每个CPU核心线程数;不配置默认为单线程; Procs=N #N为数字;表示实际分配CPU核数 RealMemory=N #N为数字,表示分配内存容量(默认单位MB) State=UNKNOWN #表示节点端状态;默认”UNKNOWN”表示不知;保持默认即可; #计算节点分区队列的属性配置;默认值;详情见下面的节点端资源配置说明计算节点分区队列配置说明:表示进行计算任务时可以指定不同的计算节点的分区队列进行不同的计算 PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP #计算分区队列;默认”debug”;可按需自定义; PartitionName=debug #表示分区队列内包含的计算节点数量;默认”ALL”;可按需自定义,节点编号规格:独立的”NodeName1″、连续的(含不连续的)”NodeName[2-3,4,6,7-10]”; Nodes=ALL #是否为计算队列分区,默认”YES”,反之则”NO”;表示Slurm在提交任务时不指定分区队列时默认使用的计算分区队列;多分区队列模式下只能一个分区配置YES模式; Default=YES #计算任务的最大时间限制(默认单位为分钟),默认”INFINITE”无限;保持默认即可; MaxTime=INFINITE #分区队列状态,默认”UP”有效;保持默认即可; State=UP
一些小的问题:
- 1.如果修改了配置文件slurm.conf,则请在master上执行scontrol reconfig命令更新配置文件。
- 2.目前集群所有机器的配置文件是一样的,如果修改了请把所有机器的conf都相应修改掉
- 3.查看各个节点的情况 scontrol show node如果出现not responding说机器通信有问题
- 4.如果要看机器的具体原因可以查看每台机器的具体日志,目录为/var/log/slurmd.log,在master上还可以查看/var/log/slurmctld.log
- 5.如果某个节点down很久了,后来你找到原因了,觉得解决了。此时因为长时间down需要update整个集群,命令为 scontrol updatenode=master,slaver1,slaver2,slaver3 state=idle
- 6.建立slurm用户的时候查看id slurm 会显示uid=1001(slurm),gid=1001(slurm),group=1001(slurm)【我的集群上】。注意每台机器上都要建一个slurm账户,当你查看发现有的机器上id slurm不一致的时候,可能有的机器是1000,这时候需要修改uid和gid为1001,所有节点一定要保持一致!然后如果之前手动建立的munge文件夹是在1000时候建立的,改了之后要把之前的文件夹删掉重新建一遍!
- 7.Sview来图形化查看任务状态,这个需要在本地有一个vnc的客户端,在master上开一个vncsever就可以连了,然后sview,否则直接命令窗登陆会看到cannot open display
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。