关于程序员:调度器slurm

参考资料

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理