Slurm 스케줄러 설치 및 구성
Slurm 스케줄러 설치 및 구성
작성자 : 서진우 (alang@clunix.com)
https://www.schedmd.com/
1. OS 기본 설정
– 클러스터 호스트 설정
vi /etc/hosts
192.168.201.161 TEST01 # 관리
192.168.201.162 TEST02 # 계산
192.168.201.163 TEST03 # 계산
– NTP 설정
[root@TEST01 ~]# vi /etc/ntp.conf
restrict default nomodify notrap noquery
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.201.0 mask 255.255.255.0 nomodify notrap
# straum 2 server list
server 127.127.1.0
fudge 127.127.1.0 stratum 10
server kr.pool.ntp.org
server time.bora.net
server time.kornet.net
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
logfile /var/log/ntp.log
# service ntpd restart
# systemctl disable chronyd
# systemctl enable ntpd
# ntpdate -u kr.pool.ntp.org
# date
# ntpq -p
[root@TEST02 ~]# vi /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 192.168.201.161
#server kr.pool.ntp.org
#server time.bora.net
#server time.kornet.net
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
# service ntpd restart
# systemctl disable chronyd
# systemctl enable ntpd
# ntpdate -u 192.168.201.161
# date
# ntpq -p
– RSH 설정
# systemctl list-units -t socket
# systemctl enable rsh.socket
# systemctl enable rlogin.socket
# vi /etc/securetty
—————————————————————–
..제일 밑에..
rsh
rlogin
—————————————————————–
# vi /etc/hosts.equiv
TEST01
TEST02
TEST03
# vi /root/.rhosts
TEST01
TEST02
TEST03
# chmod 600 /root/.rhosts
// rsh, rlogin 테스트
# rsh TEST01 hostname
TEST01
# rsh TEST02 hostname
TEST02
– SSH 설정
# vi /etc/ssh/ssh_config
.
.
HostbasedAuthentication yes
EnableSSHKeysign yes
# vi /etc/ssh/sshd_config
.
.
HostbasedAuthentication yes
IgnoreRhosts no
UseDNS yes
// 관리 서버 설정
ssh-keyscan -t rsa TEST01,192.168.201.161 > /etc/ssh/ssh_known_hosts2
ssh-keyscan -t rsa TEST02,192.168.201.162 >> /etc/ssh/ssh_known_hosts2
ssh-keyscan -t rsa TEST03,192.168.201.163 >> /etc/ssh/ssh_known_hosts2
.
scp /etc/ssh/ssh_known_hosts2 TEST0[2-3]:/etc/ssh
.
// 모든 서버 수행
chmod 644 /etc/ssh/ssh_config
chmod 600 /etc/ssh/sshd_config
chmod 644 /etc/ssh/ssh_known_hosts2
systemctl restart sshd
ssh TEST01 hostname
ssh TEST02 hostname
ssh TEST03 hostname
– NFS 설정
mkdir /engrid/enslurm -p
vi /etc/exports
/engrid/enslurm *(rw,no_root_squash)
systemctl restart nfs-server
systemctl enable nfs-server
– Yum 설정
vi /etc/yum.repos.d/centos.repo
[base-be]
name=CentOS-7 – Base
repo=os
baseurl=http://ftp.daum.net/centos/7/os/x86_64/
enabled=1
gpgcheck=0
gpgkey=http://ftp.daum.net/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
[updates-be]
name=CentOS-7 – Updates
baseurl=http://ftp.daum.net/centos/7/updates/x86_64/
enable=1
gpgcheck=0
[centosplus-be]
name=CentOS-7 – Plus
baseurl=http://ftp.daum.net/centos/7/centosplus/x86_64/
enabled=1
gpgcheck=0
[extras-be]
name=CentOS-7 – Extras
baseurl=http://ftp.daum.net/centos/7/extras/x86_64/
enable=1
gpgcheck=0
[fasttrack-be]
name=CentOS-7 – Fasttrack
baseurl=http://ftp.daum.net/centos/7/fasttrack/x86_64/
enabled=1
gpgcheck=0
yum repolist
yum install -y epel-release
2. Slurm 설치
혹시 기존의 slurm 설치 이력이 있으면 지운다.
yum remove mariadb-server mariadb-devel -y
yum remove slurm munge munge-libs munge-devel -y
slurm and munge users 가 있는지 확인해라
cat /etc/passwd | grep slurm
있다면 user와 해단 user의 폴더를 지우자
userdel -r slurm
userdel -r munge
yum install mariadb-server mariadb-devel -y
Slurm and Munge 설치 전에 모든 노드에 같은 UID and GID 가 필요하다.
useradd -m -d /var/lib/munge -s /sbin/nologin munge
useradd -m -d /var/lib/slurm -s /bin/bash slurm
yum install munge munge-libs munge-devel -y
Munge 설치 후엔 서버의 secret key를 만들어야 한다.
관리노드가 될 노드하나를 선정하자.
우선 키를 만들기 위해서 rng-tools를 설치하자.
yum install rng-tools -y
rngd -r /dev/urandom
이제 secret key를 서버에서만 만들면 된다.
/usr/sbin/create-munge-key -r
dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
chown munge. /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
secret key 만들고 나서 키를 모든 compute nodes에 보내야 한다.
scp /etc/munge/munge.key root@TEST02:/etc/munge
scp /etc/munge/munge.key root@TEST03:/etc/munge
이젠 모든 노드에 SSH 해서 permissions을 수정하고 Munge service도 시작.
chown -R munge. /etc/munge/ /var/log/munge/
chmod 0700 /etc/munge/ /var/log/munge/
systemctl enable munge
systemctl start munge
Munge를 테스트하기 위해, Munge를 통해서 다른 노드에 접속해보자
munge -n
munge -n | unmunge
munge -n | ssh TEST02 unmunge
munge -n | ssh TEST03 unmunge
remunge
[root@TEST01 ~]# munge -n
MUNGE:AwQDAACmEK3L1DQdMWmFpsQtRCtB9PicCH0mHQ+SbscZrhUQ6MIdTO6vkADy396khwZCsznQQtpwSMnaOWZ4roSpFdbm3FZnsYfy7CU7znvHowYFrgeDt84=:
[root@TEST01 ~]# munge -n | unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0
[root@TEST01 ~]# munge -n | ssh TEST02 unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0
[root@TEST01 ~]# munge -n | ssh TEST03 unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0
[root@TEST01 ~]# remunge
2018-11-07 16:04:39 Spawning 1 thread for encoding
2018-11-07 16:04:39 Processing credentials for 1 second
2018-11-07 16:04:40 Processed 17707 credentials in 1.000s (17703 creds/sec)
에러가 없다면 Ok..
최신 Slurm 다운로드 및 RPM Build
yum install openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel man2html libibmad libibumad -y
wget https://download.schedmd.com/slurm/slurm-18.08.3.tar.bz2
yum install rpm-build
rpmbuild -ta slurm-18.08.3.tar.bz2
cd /root/rpmbuild/RPMS/x86_64
mkdir /root/slurm-rpms
[root@TEST01 x86_64]# ls
slurm-18.08.3-1.el7.x86_64.rpm slurm-pam_slurm-18.08.3-1.el7.x86_64.rpm
slurm-contribs-18.08.3-1.el7.x86_64.rpm slurm-perlapi-18.08.3-1.el7.x86_64.rpm
slurm-devel-18.08.3-1.el7.x86_64.rpm slurm-slurmctld-18.08.3-1.el7.x86_64.rpm
slurm-example-configs-18.08.3-1.el7.x86_64.rpm slurm-slurmd-18.08.3-1.el7.x86_64.rpm
slurm-libpmi-18.08.3-1.el7.x86_64.rpm slurm-slurmdbd-18.08.3-1.el7.x86_64.rpm
slurm-openlava-18.08.3-1.el7.x86_64.rpm slurm-torque-18.08.3-1.el7.x86_64.rpm
[root@TEST01 x86_64]# cp slurm-*.rpm /root/slurm-rpms/
[root@TEST01 x86_64]# cd
[root@TEST01 ~]# scp -r slurm-rpms/ root@TEST02:/root
[root@TEST01 ~]# scp -r slurm-rpms/ root@TEST03:/root
# cd /root/slurm-rpms/
yum –nogpgcheck localinstall slurm-18.08.3-1.el7.x86_64.rpm \
slurm-contribs-18.08.3-1.el7.x86_64.rpm \
slurm-devel-18.08.3-1.el7.x86_64.rpm \
slurm-example-configs-18.08.3-1.el7.x86_64.rpm \
slurm-libpmi-18.08.3-1.el7.x86_64.rpm \
slurm-openlava-18.08.3-1.el7.x86_64.rpm \
slurm-pam_slurm-18.08.3-1.el7.x86_64.rpm \
slurm-perlapi-18.08.3-1.el7.x86_64.rpm \
slurm-slurmctld-18.08.3-1.el7.x86_64.rpm \
slurm-slurmd-18.08.3-1.el7.x86_64.rpm \
slurm-slurmdbd-18.08.3-1.el7.x86_64.rpm \
slurm-torque-18.08.3-1.el7.x86_64.rpm
모든 머신에 Slurm 을 설치했다면 재대로 Slurm이 잘 작동되는지 확인해보자
http://slurm.schedmd.com/configurator.easy.html 에 접속하여 Slurm configuration file을 만들어라
아래 뺴곤 default로 냅둔다.
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
SlurmctldHost=TEST01
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/linuxproc
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/linear
#SelectTypeParameters=
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=gridcenter
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
#SlurmctldDebug=3
#SlurmctldLogFile=
#SlurmdDebug=3
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=TEST0[1-3] CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
PartitionName=debug Nodes=TEST0[1-3] Default=YES MaxTime=INFINITE State=UP
Submit을 누르고나면 전체 Slurm configuration file을 받을 볼 수 있다.
vi /etc/slurm/slurm.conf
+++
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
SlurmctldHost=TEST01
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurmd
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=3
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=3
SlurmdLogFile=/var/log/slurm/slurmd.log
#
#
# COMPUTE NODES
#NodeName=TEST0[1-3] CPUs=4 RealMemory=6GB Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST01 NodeAddr=192.168.201.161 CPUs=4 State=UNKNOWN
NodeName=TEST02 NodeAddr=192.168.201.162 CPUs=4 State=UNKNOWN
NodeName=TEST03 NodeAddr=192.168.201.163 CPUs=4 State=UNKNOWN
PartitionName=hpc.q Nodes=TEST0[1-3] Default=YES MaxTime=INFINITE State=UP
+++
여기선 IP address가 순서대로 되어있지 않아있다, 그래서 저 줄은 지우고 직접 아래와 같이 바꿨다
NodeName=TEST01 NodeAddr=192.168.201.161 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST02 NodeAddr=192.168.201.162 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST03 NodeAddr=192.168.201.163 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
cd /etc/slurm
scp slurm.conf root@TEST02:$PWD
scp slurm.conf root@TEST03:$PWD
이제 서버노드를 설정하자, wonwooddo. 모든 노드들이 올바른 configuration 과 file을 가지고 있어야 한다.
mkdir /var/log/slurm
chown slurm: /var/log/slurm
touch /var/log/slurm/slurmctld.log
chown slurm: /var/log/slurm/slurmctld.log
touch /var/log/slurm/slurm_jobacct.log /var/log/slurm/slurm_jobcomp.log
chown slurm: /var/log/slurm/slurm_jobacct.log /var/log/slurm/slurm_jobcomp.log
이제 컴퓨팅 노드들을 설정하자 wwhpc[1-6]. 모든 컴퓨팅 노드들이 똑같은 설정을 가지고 있어야 한다.
mkdir /var/spool/slurmd
chown slurm: /var/spool/slurmd
chmod 755 /var/spool/slurmd
touch /var/log/slurm/slurmd.log
chown slurm: /var/log/slurm/slurmd.log
slurmd 잘 설정되어있는지 아래 명령어로 확인하자
slurmd -C
You should get something like this:
ClusterName=(null) NodeName=buhpc3 CPUs=4 Boards=1 SocketsPerBoard=2 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=7822 TmpDisk=45753
UpTime=13-14:27:52
노드간에 방화벽이 막혀있는 경우 ..
systemctl stop firewalld
systemctl disable firewalld
iptables -F
iptables -X
만일 방화벽을 열어야 할경우 Slurm이 사용하는 default port를 열어준다.
firewall-cmd –permanent –zone=public –add-port=6817/udp
firewall-cmd –permanent –zone=public –add-port=6817/tcp
firewall-cmd –permanent –zone=public –add-port=6818/tcp
firewall-cmd –permanent –zone=public –add-port=6818/tcp
firewall-cmd –permanent –zone=public –add-port=7321/tcp
firewall-cmd –permanent –zone=public –add-port=7321/tcp
firewall-cmd –reload
모든 계산 서버에서 ..
systemctl enable slurmd.service
systemctl restart slurmd.service
systemctl status slurmd.service
(만약 에러가 뜬다면:
cgroup.conf
[root@amber600 slurm]# cat cgroup.conf| grep -v ‘#’
CgroupMountpoint=”/sys/fs/cgroup”
CgroupAutomount=yes
CgroupReleaseAgentDir=”/etc/slurm/cgroup”
AllowedDevicesFile=”/etc/slurm/cgroup_allowed_devices_file.conf”
ConstrainCores=no
TaskAffinity=no
ConstrainRAMSpace=yes
ConstrainSwapSpace=no
ConstrainDevices=no
AllowedRamSpace=100
AllowedSwapSpace=0
MaxRAMPercent=100
MaxSwapPercent=100
MinRAMSpace=30
[root@amber600 slurm]# cat cgroup_allowed_devices_file.conf | grep -v ‘#’
/dev/null
/dev/urandom
/dev/zero
/dev/sda*
/dev/cpu/*/*
/dev/pts/*
관리서버에서
systemctl enable slurmctld.service
systemctl restart slurmctld.service
systemctl status slurmctld.service
slurmd와 slurmctld 를 확인해보면 잘되었는지 안되었는지 확인할수 있다.
만약 문제가 되면 로그파일을 보자!
Compute node bugs: tail /var/log/slurm/slurmd.log
Server node bugs: tail /var/log/slurm/slurmctld.log
3. Slurm 기본 사용
컴퓨팅 노드 확인
scontrol show nodes
srun 은 대화형 작업 제출 명령이고, -N 은 노드 수를 의미한다.
3대의 노드에 hostname 명령을 interactive 방식으로 제출
srun -N3 /bin/hostname
TEST01
TEST03
TEST02
큐의 작업확인하려면:
scontrol show jobs
JobId=16 JobName=hostname
UserId=root(0) GroupId=root(0)
Priority=4294901746 Nice=0 Account=(null) QOS=(null)
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=0 Reboot=0 ExitCode=0:0
RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A
SubmitTime=2016-04-10T16:26:04 EligibleTime=2016-04-10T16:26:04
StartTime=2016-04-10T16:26:04 EndTime=2016-04-10T16:26:04
PreemptTime=None SuspendTime=None SecsPreSuspend=0
Partition=debug AllocNode:Sid=buhpc3:1834
ReqNodeList=(null) ExcNodeList=(null)
NodeList=buhpc[1-5]
BatchHost=buhpc1
NumNodes=5 NumCPUs=20 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=20,node=5
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) Gres=(null) Reservation=(null)
Shared=0 Contiguous=0 Licenses=(null) Network=(null)
Command=/bin/hostname
WorkDir=/root
Power= SICP=0
script로 작업을 제출하려면 script를 작성하고 아래와같이 한다
sbatch -N2 script-file
http://www.sdsc.edu/~hocks/FG/PBS.slurm.html
1. 기본명령어 요약
명령어
내용
$ sbatch [옵션..] 스크립트
작업 제출
$ scancel 작업ID
작업 삭제
$ squeue
작업 상태 확인
# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
129 hpc.q test root R 0:02 1 TEST01
* JOBID : 제출한 작업의 식별 번호
* PARTITION : 현재 작업이 제출된 파티션의 이름
(slurm에서의 partition은 SGE에서의 queue와 같은 개념)
* NAME : 작업의 이름
* USER : 작업을 제출한 리눅스 계정의 이름
* ST : 현재 작업의 상태 (R: running, PD: pending)
* NODELIST : 현재 이 작업을 수행할 수 있도록 할당된 컴퓨터 노드들
$ smap
작업 상태 및 노드 상태 확인
$ sinfo [옵션..]
노드 정보 확인
$ srun [옵션…] 실행파일
작업 제출 (interactive 작업용)
2. sinfo
slurm 노드 및 파티션 정보를 조회합니다. 사용방법 및 예제는 아래와 같습니다.
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
single_k40_node up 1-00:00:00 2 alloc tesla[01-02]
single_k40_node up 1-00:00:00 15 idle tesla[03-17]
dual_v100_node up 1-00:00:00 11 idle tesla[18-28]
single_v100_node up 1-00:00:00 1 alloc tesla30
single_v100_node up 1-00:00:00 1 idle tesla29
skl_node up 1-00:00:00 9 idle skl[01-09]
bigmem_node up 1-00:00:00 2 idle bigmem,bigmem2]
3. sbatch
작업 제출을 위한 명령어입니다. 사용방법 및 예제는 아래와 같습니다.
$ sbatch ./job_script.sh
[작업스크립트 예제]
#!/bin/sh
#SBATCH -J test # 작업 이름
#SBATCH -p dual_v100_node # partition 이름
#SBATCH -N 2 # 총 필요한 컴퓨팅 노드 수
#SBATCH -n 2 # 총 필요한 프로세스 수 (–ntasks=2)
#SBATCH -o test.o%j # stdout 파일 명
#SBATCH -e test.e%j # stderr 파일 명
#SBATCH -t 00:30:00 # 최대 작업 시간 (Wall Time Clock Limit) (–time)
#SBATCH –gres=gpu # GPU를 사용하기 위한 옵션
#SBATCH –mem=1gb
srun lmp_mpi -sf gpu -in in.lj
[작업스크립트 작성 안내]
slurm에게 전달해야 할 정보는 작업스크립트 내에 #SBATCH 지시자를 붙여 전달합니다.
(1) 작업 이름
작업 이름을 명시하지 않으면 slurm이 임의로 부여합니다..
작업 이름을 test 로 지정할 경우 “–job-name=test” 또는 “-J test” 와 같이 사용합니다.
(2) 작업 파티션 이름
작업 수행할 파티션을 지정하는 것이며, 사용가능한 파티션 이름은 sinfo 명령어로 확인이 가능합니다.
파티션을 dual_v100_node으로 사용할 경우, “–partition=dual_v100_node” 또는 “-p dual_v100_node” 와 같이 사용합니다.
(3) 필요한 자원의 양
작업 수행에 필요한 총 프로세스 수는 “-n” 옵션으로, 작업 수행에 필요한 컴퓨팅 노드 개수는 “-N”으로 정의합니다.
(4) output
Standard output을 저장할 파일명을 정의합니다.
파일명을 test.out으로 사용할 경우, “–output=test.out” 또는 “-o test.out” 과 같이 사용합니다.
(5) error
Standard error 를 저장할 파일명을 정의합니다.
파일명을 test.err으로 사용할 경우, “–error=test.err” 또는 “-e test.err” 와 같이 사용합니다.
(6) Wall Time Clock Limit
예상되는 작업 소요 시간을 의미하며, 실제 예상되는 작업 소요 시간보다 약간 더 길게 설정해 주는 것이 안전합니다.
만약 해당 작업이 설정해 둔 시간내에 종료 되지 않을 경우, Wall Time Clock Limit 시간을 초과하는 시점에서 slurm이 해당 작업을 강제로 종료시킵니다. 이 키워드는 작업 제출 스크립트 파일에 반드시 지정되어야 하며, 초단위 또는 시:분:초 형식으로 지정할 수 있습니다.
Wall Time Clock Limit을 1시간을 지정할 경우, “–time=01:00:00: 또는 “-t 01:00:00″ 과 같이 사용합니다.
4. squeue
제출된 작업 목록 및 정보 조회 명령어입니다. 사용방법 및 예제는 아래와 같습니다.
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
760 tesla_nod test sunlsy PD 0:00 10 (Resources)
761 tesla_nod test sunlsy PD 0:00 10 (Priority)
762 tesla_nod test sunlsy PD 0:00 10 (Priority)
763 tesla_nod test sunlsy PD 0:00 10 (Priority)
764 tesla_nod test sunlsy PD 0:00 10 (Priority)
765 tesla_nod test sunlsy PD 0:00 10 (Priority)
759 tesla_nod test sunlsy R 1:09 10 tesla[01-10]
[제출된 작업 상세 조회]
scontrol 명령어를 이용하면 제출된 작업의 상세내역을 조회할 수 있습니다. 사용방법 및 예제는 아래와 같습니다.
$ scontrol show job [작업 ID]
– 예제 –
$ scontrol show job 3217
JobId=3217 JobName=ssw_test
UserId=moasys1(100001107) GroupId=in0011(1000011) MCS_label=N/A
Priority=4294901630 Nice=0 Account=kat_user QOS=normal
JobState=RUNNING Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=00:00:05 TimeLimit=01:00:00 TimeMin=N/A
SubmitTime=2018-04-30T17:54:07 EligibleTime=2018-04-30T17:54:07
StartTime=2018-04-30T17:54:07 EndTime=2018-04-30T18:54:08 Deadline=N/A
PreemptTime=None SuspendTime=None SecsPreSuspend=0
Partition=single_k40_node AllocNode:Sid=login-tesla02:9203
ReqNodeList=(null) ExcNodeList=(null)
NodeList=tesla[03-04]
BatchHost=tesla03
NumNodes=2 NumCPUs=40 NumTasks=4 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=40,node=2,gres/gpu=2
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
Gres=gpu Reservation=(null)
OverSubscribe=NO Contiguous=0 Licenses=(null) Network=(null)
Command=./kat-2.sh
WorkDir=/scratch2/moasys1/ssw/moasys1/kat_test
StdErr=/scratch2/moasys1/ssw/moasys1/kat_test/ssw.e3217
StdIn=/dev/null
StdOut=/scratch2/moasys1/ssw/moasys1/kat_test/ssw.o3217
Power=
5. scancel
제출된 작업 수행을 취소합니다. 사용방법은 아래와 같습니다.
$ scancel [작업 ID]
5. smap
sinfo와 squeue에서 보여주는 정보를 그래픽화면으로 보여줍니다.
6. srun
작업 제출 (인터액티브 수행)을 위한 명령어입니다. sbatch에서 설명했던 예제를 인터액티브 모드로 작업 제출하면 다음과 같습니다.
$ srun -n 2 -N 2 -p dual_v100_node –gres=gpu lmp_mpi -sf gpu -in in.lj
7. sbcast
로컬디스크에 있는 작업 파일을 작업이 할당된 로컬 디스크로 자동 복사하는 명령
> cat my.job
#!/bin/bash
sbcast my.prog /tmp/my.prog
srun /tmp/my.prog
> sbatch –nodes=8 my.job
srun: jobid 12345 submitted
[slurm 계산 노드 정보 ]
– parririon 정보 확인
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
hpc.q* up infinite 3 idle TEST[01-03]
– 상세 자원 정보 출력
$ sinfo -N -l
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
TEST01 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none
TEST02 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none
TEST03 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none
– sinfo 사용 참고 : https://slurm.schedmd.com/sinfo.html
[작업 제출]
sbatch 명령을 이용하여 slurm 스케줄러로 작업 제출
$ sbatch run.sh
[작업 조회]
squeue 명령을 이용하여 작업 조회
$ squeue
* R : RUNNING 상태
* PD : PENDING 상태
* S : SUSPENDED 상태
* ST : STOP 상태
* CD : COMPLETED 상태
* CA : CANCELLED 상태
* F : FAILED 상태
* NF : NODE_FAIL 상태
– 참고 : https://slurm.schedmd.com/squeue.html
[작업 정보 조회]
sacct -j {작업ID} –format {포멧지정}
sacct -j 1902 –format JobID,jobname,NTasks,nodelist,MaxRSS,MaxVMSize,AveRSS,AveVMSize
[수행 중인 작업 정보 조회]
sstat -j {작업ID} –format {포멧지정}
sstat -j 1902 –format JobID,jobname,nodelist,MaxVMSize,MaxRSS,MaxDiskRead,MaxDiskWrite
$ scontrol show job 186
UserId=root(0) GroupId=root(0) MCS_label=N/A
Priority=4294901714 Nice=0 Account=root QOS=normal
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=00:00:20 TimeLimit=00:30:00 TimeMin=N/A
SubmitTime=2018-11-08T14:37:47 EligibleTime=2018-11-08T14:37:47
AccrueTime=Unknown
StartTime=2018-11-08T14:39:20 EndTime=2018-11-08T14:39:40 Deadline=N/A
PreemptTime=None SuspendTime=None SecsPreSuspend=0
LastSchedEval=2018-11-08T14:39:20
Partition=hpc.q AllocNode:Sid=TEST03:1592
ReqNodeList=(null) ExcNodeList=(null)
NodeList=TEST03
BatchHost=TEST03
NumNodes=1 NumCPUs=2 NumTasks=2 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=2,node=1,billing=2
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
OverSubscribe=OK Contiguous=0 Licenses=explicit:1 Network=(null)
Command=/home/job1.sh
WorkDir=/home
StdErr=/home/test.e186
StdIn=/dev/null
StdOut=/home/test.o186
Power=
# qstat -f 186
Job Id: 186
Job_Name = test
Job_Owner = root@TEST03
job_state = R
queue = hpc.q
qtime = Thu Nov 8 14:37:47 2018
mtime = Thu Nov 8 14:39:20 2018
ctime = Thu Nov 8 15:09:20 2018
Account_Name = root
exec_host = TEST03/2
Priority = 4294901714
euser = root(0)
egroup = root(0)
Resource_List.walltime = 00:30:00
Resource_List.nodect = 1
Resource_List.ncpus = 2
$ sview : SGE 의 qmon
//// GPU 및 Resource Complex
vi /etc/slurm/gres.conf
+++
# Configure support for our four GPUs, plus bandwidth
Name=gpu Type=tesla File=/dev/nvidia0 CPUs=0,1
Name=gpu Type=tesla File=/dev/nvidia1 CPUs=0,1
Name=gpu Type=kepler File=/dev/nvidia2 CPUs=2,3
Name=gpu Type=kepler File=/dev/nvidia3 CPUs=2,3
Name=bandwidth Type=lustre Count=4G
+++
vi /etc/slurm/slurm.conf
GresTypes=gpu,bandwidth
NodeName=tux[0-7] Gres=gpu:tesla:2,gpu:kepler:2,bandwidth:lustre:no_consume:4G
#!/bin/bash
#
# gres_test.bash
# Submit as follows:
# sbatch –gres=gpu:4 -n4 -N1-1 gres_test.bash
#
srun –gres=gpu:2 -n2 –exclusive show_device.sh &
srun –gres=gpu:1 -n1 –exclusive show_device.sh &
srun –gres=gpu:1 -n1 –exclusive show_device.sh &
wait
JobStep=1234.0 CUDA_VISIBLE_DEVICES=0,1
JobStep=1234.1 CUDA_VISIBLE_DEVICES=2
JobStep=1234.2 CUDA_VISIBLE_DEVICES=3
//// license 설정
= local
slurm 스케줄러 내에 라이선스나 기타 complex 항목을 생성하여 자원을 관리할 수
있다.
방법은 간단하다.
slurm.conf
+++
Licenses=fluent:30,ansys:100
+++
scontrol show lic
LicenseName=ansys
Total=100 Used=0 Free=100 Remote=no
LicenseName=fluent
Total=30 Used=0 Free=30 Remote=no
sbatch -L ansys:2 script.sh
Submitted batch job 5212
$ scontrol show lic
LicenseName=ansys
Total=100 Used=2 Free=98 Remote=no
LicenseName=fluent
Total=30 Used=0 Free=30 Remote=no
= remote
일단 slurm 의 경우 flexlm 및 기타 네트워크 라이선스 서버와 연동하는 방법은
아직 없다. (곧 나오겠지만..)
일단 DBMS 를 통해 중앙의 서버에서 자원 항목을 관리할 수 있다.
추후 flexlm 서버의 실제 상태를 파악해서 해당 DB 에 업데이트하는 방식으로
SGE qlicserver 와 같은 기능을 만들수도 있을듯…
일단 DB를 이용한 자원 관리 방법은 sacctmgr 명령을 이용해서 가능하다.
사전 준비
slurm-slurmdbd 설치
mariadb-server 설치
사전 준비
mysql> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
+————————-+———–+
| Variable_name | Value |
+————————-+———–+
| innodb_buffer_pool_size | 134217728 |
+————————-+———–+
실제 서비스에서는 innodb 관련 사이즈를 키워준다.
$cat my.cnf
…
[mysqld]
innodb_buffer_pool_size=1024M
innodb_log_file_size=64M
innodb_lock_wait_timeout=900
mysql>
create user ‘slurm’@’localhost’ identified by ‘password’;
grant all on slurm_acct_db.* TO ‘slurm’@’localhost’;
create database slurm_acct_db;
# vi /etc/slurm/slurm.conf
+++
AccountingStorageType=accounting_storage/slurmdbd
+++
# vi /etc/slurm/slurmdbd.conf
+++
#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
ArchiveJobs=yes
ArchiveDir=”/tmp”
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
#AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
DbdAddr=localhost
DbdHost=localhost
#DbdPort=7031
SlurmUser=slurm
#MessageTimeout=300
DebugLevel=4
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=localhost
#StoragePort=3306
StoragePass=password
StorageUser=slurm
StorageLoc=slurm_acct_db
관리서버
systemctl restart slurmdbd
systemctl restart slurmctld.service
모든서버
systemctl restart slurmd
# mysql -u slurm -ppassword slurm_acct_db
MariaDB [slurm_acct_db]> show tables;
# sacctmgr add cluster gridcenter
# sacctmgr list cluster
Cluster ControlHost ControlPort
———- ————— ————
gridcenter 127.0.0.1 6817
# sacctmgr add resource name=explicit count=1024 \
server=GCT3MGR01 servertype=flexlm type=license \
percentallowed=100 cluster=gridcenter
# sacctmgr show resource
Name Server Type Count % Allocated ServerType
———- ———- ——– —— ———– ———-
explicit gct3mgr01 License 101 100 flexlm
# sacctmgr show resource withclusters
Name Server Type Count % Allocated ServerType Cluster % Allowed
———- ———- ——– —— ———– ———- ———- ———-
explicit gct3mgr01 License 101 100 flexlm gridcenter 100
# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=1024 Used=0 Free=1024 Remote=yes
# srun -L explicit@gct3mgr01:91 sleep 300
# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=1024 Used=91 Free=933 Remote=yes
# sacctmgr modify resource name=explicit server=gct3mgr01 set count=100
# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=100 Used=0 Free=100 Remote=yes
/// RQS, QOS 설정
SET:
sacctmgr modify user bob set GrpTRES=cpu=1500,mem=200,gres/gpu=50
UNSET:
sacctmgr modify user bob set GrpTRES=cpu=-1,mem=-1,gres/gpu=-1
/// MPI 연동
# srun –mpi=list
srun: MPI types are…
srun: openmpi
srun: none
srun: pmi2
vi p_job.sh
#!/bin/sh
#SBATCH -J test
#SBATCH -p hpc.q
#SBATCH -N 2
#SBATCH -n 4
#SBATCH -o test.o%j
#SBATCH –time 00:30:00
SLURM_NODEFILE=`generate_pbs_nodefile`
srun hostname
echo $SLURM_NTASKS
echo $SLURM_TASKS_PER_NODE
echo $SLURM_NODEFILE
cat $SLURM_NODEFILE
sbatch p_job.sh
cat test.0.111
TEST01
TEST02
TEST01
TEST01
4
3,1
/tmp/ZimFnCUOYo
TEST01
TEST01
TEST01
TEST02
#!/bin/sh
#SBATCH -J test
#SBATCH -p hpc.q
#SBATCH -N 2
#SBATCH –ntasks-per-node=2
#SBATCH -o test.o%j
#SBATCH –time 00:30:00
SLURM_NODEFILE=`generate_pbs_nodefile`
srun hostname
echo $SLURM_NTASKS
echo $SLURM_TASKS_PER_NODE
echo $SLURM_NODEFILE
cat $SLURM_NODEFILE
TEST01
TEST02
TEST01
TEST02
4
2(x2)
/tmp/6ZBvpSirZY
TEST01
TEST01
TEST02
TEST02
srun hostname -s | sort | uniq > hosts.$SLURM_JOB_ID
cat hosts.$SLURM_JOB_ID
fluent 3d -t$SLURM_NTASKS -slurm -cnf=hosts.$SLURM_JOB_ID
/// abaqus
#!/bin/bash
#SBATCH -J MyJobName
#SBATCH -A myaccount
#SBATCH –nodes=4
#SBATCH –time=72:00:00
#SBATCH -p ProdQ
#
#SBATCH –ntasks-per-node=40
#SBATCH –cpus-per-task=1
#SBATCH -o %x-%j.log
env_file=abaqus_v6.env
cat << EOF > ${env_file}
#verbose = 3
#ask_delete = OFF
scratch=”$PWD”
mp_mpirun_options=”-TCP”
EOF
node_list=$(scontrol show hostname ${SLURM_NODELIST} | sort -u)
mp_host_list=”[”
for host in ${node_list}; do
mp_host_list=”${mp_host_list}[‘$host’, ${SLURM_CPUS_ON_NODE}],”
done
mp_host_list=$(echo ${mp_host_list} | sed -e “s/,$/]/”)
echo “mp_host_list=${mp_host_list}” >> ${env_file}
### Set input file and job (file prefix) name here
job_name=${SLURM_JOB_NAME}
### ABAQUS parallel execution
input_file=input.inp
abaqus job=${job_name} input=${input_file} cpus=${SLURM_NTASKS} int