Torque Scheduler Design and Config

통상 HPC 환경에서 스케쥴러와 연동하여 MPI job 을 수행하게 되는데, 이러한 기본 환경을 만들려면 아래와 같은 준비 사항이 있어야 합니다. 그러나 이번 글에서는 HPC 전부를 다루는것이 아니라 Scheduler 기본 기능만 테스트 할것이기 때문에, 필요한 부문만 설정하고, 나머지는 생략하며, OS의 필요한 모든 패키지는 모두 기본적으로 설치 되어 있다고 가정 합니다.

  • 인증 시스템 | Passwordless 환경 구현 | 공유 스토리지 | 고속 통신 어탭터
  • MPI 환경 | 컴파일러 환경 | 스케쥴러 환경

테스트를 하기 위한 기본 가상머신의 구성 환경

node1: 4core, pbs_server, pbs_sched, pbs_mom, trqauthd, maui.d, nfs Server
node2: 4core, pbs_mom, trqauthd, nfs client
node3: 4core, pbs_mom, trqauthd, nfs client

필요한 파일들은 아래의 Reference Web Site 에서 참고하여 다운로드 합니다.

[root@node1 home]# ls -l
합계 7084
drwx------  6 isbc isbc   12288 2014-07-31 15:15 isbc
drwxrwxr-x 14  603  603    4096 2014-07-31 13:47 maui-3.3.1
-rw-r--r--  1 root root  901179 2014-07-30 22:55 maui-3.3.1.tar.gz
drwxr-xr-x  2 root root    4096 2014-07-31 01:43 rpm
drwxr-xr-x  6 1167 2010    4096 2014-07-30 23:00 torque-4.2.8
-rw-r--r--  1 root root 6320344 2014-07-30 22:56 torque-4.2.8.tar.gz

torque 부터 rpm 으로 build 하여 아래와 같은 package를 생성된걸 확인 합니다.

[root@node1 x86_64]# pwd
/root/rpmbuild/RPMS/x86_64
[root@node1 x86_64]# ls -s
합계 4576
 660 torque-4.2.8-1.adaptive.el6.x86_64.rpm
 208 torque-client-4.2.8-1.adaptive.el6.x86_64.rpm
3080 torque-debuginfo-4.2.8-1.adaptive.el6.x86_64.rpm
 208 torque-devel-4.2.8-1.adaptive.el6.x86_64.rpm
  40 torque-scheduler-4.2.8-1.adaptive.el6.x86_64.rpm
 380 torque-server-4.2.8-1.adaptive.el6.x86_64.rpm
[root@node1 x86_64]# 

각 노드에는 아래와 같이 설치 되어 있으면 됩니다.

[root@node1 x86_64]# ssh node1 "rpm -qa | grep torque" <-- Torque Server
torque-debuginfo-4.2.8-1.adaptive.el6.x86_64
torque-scheduler-4.2.8-1.adaptive.el6.x86_64
torque-client-4.2.8-1.adaptive.el6.x86_64
torque-devel-4.2.8-1.adaptive.el6.x86_64
torque-server-4.2.8-1.adaptive.el6.x86_64
torque-4.2.8-1.adaptive.el6.x86_64
[root@node1 x86_64]# ssh node2 "rpm -qa | grep torque" <-- Torque Client
torque-4.2.8-1.adaptive.el6.x86_64
torque-client-4.2.8-1.adaptive.el6.x86_64
torque-devel-4.2.8-1.adaptive.el6.x86_64
torque-debuginfo-4.2.8-1.adaptive.el6.x86_64
[root@node1 x86_64]# ssh node3 "rpm -qa | grep torque" <-- Torque Client
torque-4.2.8-1.adaptive.el6.x86_64
torque-client-4.2.8-1.adaptive.el6.x86_64
torque-devel-4.2.8-1.adaptive.el6.x86_64
torque-debuginfo-4.2.8-1.adaptive.el6.x86_64

torque의 기본 package를 각 해당 노드에 설치 되어 있으면, torque를 구성하기 전에 ssh password less 환경을 만들어 줍니다. root 계정처럼 각 노드에 있는것은 ssh-keygen, ssh-copy-id 로만 사용해서 간단하게 만들수 있지만 공유 볼륨인경우에는 authorized_keys 파일및 각 노드의 기본 키값을 공유 해야 하는데, 각 노드마다 다른 이름으로 사용하던지 아니면 cluster manager 에서 만들어주는 환경의 기반으로 passwordless 환경을 구현 하면 됩니다. 아래는 nfs 와 같은 계정에서의 key 공유 하는 config 를 정리 해놓은것입니다.

[isbc@node1 ~]$ cat .ssh/config 
StrictHostKeyChecking no

Host node1
     HostName node1
     User isbc
     IdentityFile ~/.ssh/node1

Host node2
     HostName node2
     User isbc
     IdentityFile ~/.ssh/node2

Host node3
     HostName node3
     User isbc
     IdentityFile ~/.ssh/node3
[isbc@node1 ~]$ ls -l .ssh/
합계 36
-rw------- 1 isbc isbc 1176 2014-07-31 01:32 authorized_keys
-rw------- 1 isbc isbc  259 2014-07-31 01:33 config
-rw-r--r-- 1 isbc isbc 1200 2014-07-31 09:28 known_hosts
-rw------- 1 isbc isbc 1675 2014-07-31 01:04 node1
-rw-r--r-- 1 isbc isbc  392 2014-07-31 01:04 node1.pub
-rw------- 1 isbc isbc 1675 2014-07-31 01:06 node2
-rw-r--r-- 1 isbc isbc  392 2014-07-31 01:06 node2.pub
-rw------- 1 isbc isbc 1675 2014-07-31 01:32 node3
-rw-r--r-- 1 isbc isbc  392 2014-07-31 01:32 node3.pub
[isbc@node1 ~]$ 

위와 같이 공유 볼륨을 만들기 위해서는 nfs를 설정 해야 합니다. 간혹 nfsv4 를 사용하게 되면 nfs client 에서 각 디렉토리의 권한이 nobody:nobody 로 나오는경우가 있으니 주의 해야 한다.

[root@node1 ~]# cat /etc/exports 
# sample /etc/exports file
/home           *(rw,no_root_squash,sync)
[root@node1 ~]# ssh node2 "cat /etc/fstab"
#
# /etc/fstab
# Created by anaconda on Wed Jul 30 21:07:00 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                  ext4    defaults        1 1
UUID=35b9231f-48ec-4f72-a1de-f3a38f4f4e0a /boot ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap               swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sr0		/media/1		iso9660	defaults	0 0
/dev/sr1		/media/2		iso9660 defaults	0 0
node1:/home		/home			nfs	defaults,vers=3	0 0

그럼 nfs, ssh 등의 사전 구성이 모두 완료 되었으면, torque를 구성하면 된다. 설치후 시스템 재 부팅하면 pbs_server가 자동으로 뜨게 되는데, “service pbs_server stop” 후에 아래와 같이 실행 하면 기본 환경이 구성됩니다.

[root@node1 ~]# /usr/share/doc/torque-server-4.2.8/torque.setup
USAGE:  torque.setup  []
[root@node1 ~]# /usr/share/doc/torque-server-4.2.8/torque.setup isbc node1
initializing TORQUE (admin: isbc@node1)

You have selected to start pbs_server in create mode.
If the server database exists it will be overwritten.
do you wish to continue y/(n)? y

Torque server 환경 구성 파일 생성 nodes 에는 cluster에 참여 하는 노드와 np라고 하는(통상 process core를 말합니다, 그러나 Core수와 상관없이 수량은 조절할수 있습니다.)값을 정의해주고, config 에는 server역활을할 노드와 log를 어느정도 남겨둘지 정의 합니다.

[root@node1 ~]# cat /var/spool/torque/server_priv/nodes 
node1 np=4 efgroup
node2 np=4 efgroup
node3 np=4 efgroup
[root@node1 ~]# cat /var/spool/torque/server_priv/config 
$pbsserver     node1          # hostname running pbs server
$logevent      225            # bitmap of which events to log
[root@node1 ~]# service pbs_server restart

Torque Client 부문의 환경구성 (node1~3 모두 아래와 같이 준비 하면 됩니다.)

[root@node1 ~]# cat /var/spool/torque/mom_priv/config 
$pbsserver node1
[root@node1 ~]# service pbs_mom restart
Shutting down TORQUE Mom: shutdown request successful on localhost
                                                           [  OK  ]
Starting TORQUE Mom:                                       [  OK  ]
[root@node1 ~]# 

이제 모두 관련 데몬및 구성이 완료 되었으면 torque server side 에서 아래와 같이 확인 가능하다. 아래의 구성에서 queue이름은 여러 그룹에 따라서 queue를 여러개 만들어서 운용할수도 있으니, 상세한부분은 reference site를 참고. 아래 추가로, server_pack=false 부문이 있는데, 이것을 설정하면 scatter 형식으로 job 관리가 된다고 되었는데, 실제로는 다른 의미 인듯하네요, 기본적으로 torque는 node1 (1,2,3,4) -> node2 (1,2,3,4) -> node3(1,2,3,4) 이런순으로 잡이 assign 되도로고 설계 되어 있습니다. 만약 node1 (1) -> node2(1) -> node3(1) 이런순으로 정책을 변경하고 싶다면 pbs_sched 를 maui 로 변경 해야 관련 구성이 가능합니다.

[root@node1 ~]# qmgr -c 'p s'
#
# Create queues and set their attributes.
#
#
# Create and define queue batch
#
create queue batch
set queue batch queue_type = Execution
set queue batch resources_default.nodes = 1:ppn=1
set queue batch resources_default.walltime = 01:00:00
set queue batch enabled = True
set queue batch started = True
#
# Set server attributes.
#
set server scheduling = True
set server acl_hosts = node1
set server managers = isbc@node1
set server operators = isbc@node1
set server default_queue = batch
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 300
set server default_node = 1#shared
set server node_pack = False
set server job_stat_rate = 45
set server poll_jobs = True
set server mom_job_sync = False
set server keep_completed = 300
set server next_job_number = 138
set server moab_array_compatible = True
set server interactive_jobs_can_roam = True
set server nppcu = 1
[root@node1 ~]# 

Torque node list 환경정보, 이것으로써 기본구성은 완료 한것입니다.

[root@node1 ~]# pbsnodes -a
node1
     state = free
     np = 4
     properties = efgroup
     ntype = cluster
     status = rectime=1406795706,varattr=,jobs=,state=free,netload=14914594,gres=,loadave=0.01,ncpus=4,physmem=3920956kb,availmem=7767472kb,totmem=7984180kb,idletime=0,nusers=1,nsessions=1,sessions=18925,uname=Linux node1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64,opsys=linux
     mom_service_port = 15002
     mom_manager_port = 15003

node2
     state = free
     np = 4
     properties = efgroup
     ntype = cluster
     status = rectime=1406795740,varattr=,jobs=,state=free,netload=5828525,gres=,loadave=0.00,ncpus=4,physmem=3920956kb,availmem=7843056kb,totmem=7984180kb,idletime=0,nusers=0,nsessions=0,uname=Linux node2 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64,opsys=linux
     mom_service_port = 15002
     mom_manager_port = 15003

node3
     state = free
     np = 4
     properties = efgroup
     ntype = cluster
     status = rectime=1406795740,varattr=,jobs=,state=free,netload=4861872,gres=,loadave=0.00,ncpus=4,physmem=3920956kb,availmem=7838772kb,totmem=7984180kb,idletime=0,nusers=0,nsessions=0,uname=Linux node3 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64,opsys=linux
     mom_service_port = 15002
     mom_manager_port = 15003

[root@node1 ~]# 

다음으로는, pbs_sched 데몬을 대체할 maui를 빌드 하여 구성하고, pbs_sched 를 off 한후에 대신에 maui.d를 사용하면 된다.

[root@node1 ~]# cd /home/maui-3.3.1
[root@node1 maui-3.3.1]# ./configure
[root@node1 maui-3.3.1]# gmake
[root@node1 maui-3.3.1]# make install
[root@node1 maui-3.3.1]# cd etc
[root@node1 etc]# ls
maui.csh  maui.csh.in  maui.d  maui.sh  maui.sh.in
[root@node1 etc]# cp maui.d /etc/init.d/
[root@node1 etc]# cat /etc/init.d/maui.d 
#!/bin/sh
#
# maui	This script will start and stop the MAUI Scheduler
#
# chkconfig: 345 85 85
# description: maui
#
ulimit -n 32768
# Source the library functions
. /etc/rc.d/init.d/functions

MAUI_PREFIX=/usr/local/maui <-- 경로 수정

# setup maui path <-- 추가 
if [ ! `echo $PATH | /bin/grep "maui/sbin"` ]; then
  export PATH=$PATH:/usr/local/maui/sbin
fi
if [ ! `echo $PATH | /bin/grep "maui/bin"` ]; then
  export PATH=$PATH:/usr/local/maui/bin
fi


# let see how we were called
case "$1" in
	start) 
		echo -n "Starting MAUI Scheduler: "
		daemon $MAUI_PREFIX/sbin/maui
		echo
		;;
	stop)
		echo -n "Shutting down MAUI Scheduler: "
		killproc maui
		echo
		;;
	status)
		status maui
		;;
	restart)
		$0 stop
		$0 start
		;;
	*)
		echo "Usage: maui {start|stop|restart|status}"
		exit 1
esac
[root@node1 etc]# chkconfig --add /etc/init.d/maui.d
[root@node1 etc]# chkconfig maui.d on
[root@node1 etc]# chkconfig pbs_sched off
[root@node1 etc]# service pbs_sched stop
[root@node1 etc]# service maui.d start

maui 관련 기본설치는 완료 되었고, 다음으로 maui 구성을 아래와 같이 수정한후 관련 데몬 재시작하면 됩니다.

[root@node1 ~]# cat /usr/local/maui/maui.cfg
.
.
# Node Allocation: http://supercluster.org/mauidocs/5.2nodeallocation.html

# NODEALLOCATIONPOLICY  MINRESOURCE
NODEALLOCATIONPOLICY  PRIORITY
NODECFG[DEFAULT]      PRIORITYF='10 * APROCS - LOAD - JOBCOUNT'
.
.
.

기본 테스트 스크립트..

[isbc@node1 ~]$ cat test.sh 
#!/bin/sh -x
#PBS -N test
#PBS -l walltime=10:30,mem=320kb
#PBS -m be

ls -la
sleep 30
echo done
[isbc@node1 ~]$ qsub test.sh

Job Submit 후에 queue stat 을 확인하면 각각의 노드마다 maui 에 적용된 노드 정책에 따라서 job이 balance하게 들어가는것을 확인 할수 있다.

[root@node1 ~]# watch -n 1 "qstat -nr"
Every 1.0s: qstat -nr                                                                        Thu Jul 31 17:56:49 2014


node1:
                                                                                  Req'd    Req'd       Elap
Job ID                  Username    Queue    Jobname          SessID  NDS   TSK   Memory   Time    S   Time
----------------------- ----------- -------- ---------------- ------ ----- ------ ------ --------- - ---------
138.node1               isbc        batch    test              14931     1	1  320kb  00:10:30 R  00:00:15
   node1/0 --> node1번에..
139.node1               isbc        batch    test               3420     1	1  320kb  00:10:30 R  00:00:15
   node2/0 --> node2번에..
140.node1               isbc        batch    test               3030     1	1  320kb  00:10:30 R  00:00:15
   node3/0 --> node3번에..
141.node1               isbc        batch    test              14972     1	1  320kb  00:10:30 R  00:00:15
   node1/1
142.node1               isbc        batch    test               3438     1	1  320kb  00:10:30 R  00:00:14
   node2/1
143.node1               isbc        batch    test               3048     1	1  320kb  00:10:30 R  00:00:14
   node3/1
144.node1               isbc        batch    test              15008     1	1  320kb  00:10:30 R  00:00:14
   node1/2
145.node1               isbc        batch    test               3456     1	1  320kb  00:10:30 R  00:00:13
   node2/2

이것으로서 torque의 자원 사용 정책 관련하여 test를 해보았습니다. 만약에 maui를 사용하지 않는다면 아래와 같이 job 이 들어가기 때문에 자원을 활용에 제한이 좀 생기게 됩니다.

Every 1.0s: qstat -nr                                                                        Thu Jul 31 17:56:49 2014


node1:
                                                                                  Req'd    Req'd       Elap
Job ID                  Username    Queue    Jobname          SessID  NDS   TSK   Memory   Time    S   Time
----------------------- ----------- -------- ---------------- ------ ----- ------ ------ --------- - ---------
138.node1               isbc        batch    test              14931     1	1  320kb  00:10:30 R  00:00:15
   node1/0 --> node1 부터 순서대로 들어가는것이 기본입니다.(Torque에서는)
139.node1               isbc        batch    test               3420     1	1  320kb  00:10:30 R  00:00:15
   node1/1
140.node1               isbc        batch    test               3030     1	1  320kb  00:10:30 R  00:00:15
   node1/2
141.node1               isbc        batch    test              14972     1	1  320kb  00:10:30 R  00:00:15
   node1/3
142.node1               isbc        batch    test               3438     1	1  320kb  00:10:30 R  00:00:14
   node2/0
143.node1               isbc        batch    test               3048     1	1  320kb  00:10:30 R  00:00:14
   node2/1
144.node1               isbc        batch    test              15008     1	1  320kb  00:10:30 R  00:00:14
   node2/2
145.node1               isbc        batch    test               3456     1	1  320kb  00:10:30 R  00:00:13
   node2/3

Reference Web Site Links:

  • http://docs.adaptivecomputing.com/maui/
  • http://docs.adaptivecomputing.com/maui/5.2nodeallocation.php
  • http://docs.adaptivecomputing.com/torque/help.htm
  • http://docs.adaptivecomputing.com/maui/pbsintegration.php
  • http://wiki.rac.manchester.ac.uk/community/TorqueMauiHowTo
  • http://www.physics.orst.edu/cluster_install

Torque Scheduler Design and Config”에 대한 5개의 생각

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다