乐趣区

关于程序员:调度器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
退出移动版