[클러스터] PBS(Portable Batch System) 관리 사용 하기
PBS(Portable Batch System) 관리자 및 사용자 튜토리얼
이문서는 PBS를 사용하여 배치작업을 수행하려고 하는 사용자가 알아야 할
기본적인 명령어와 사용법에 대해 설명한다. 이문서는 OpenPBS 2.3.16을 기준으로
작성되었다. 사용자는 bash 쉘을 사용한다고 가정한다.
목차
1. 시작하기
1.1. 환경 변수 설정
1.2. PBS 명령어
1.3. Hello World
1.4. 작업 환경 변수
2. 배치 작업을 위한 큐 관리
2.1. Qmgr Command (batch system manager)
1) 도움말 보기
2) 관리자 변경
3) Qmgr 명령어의 기능
4) 새로운 큐 만들기
2.2. 서버, 큐, 작업 속성
1) 서버 속성(server attributes)
2) 큐 속성(queue attributes)
3) 작업 속성(job attributes)
3. 작업 실행 예제
3.1. Single-Host Job
3.2. Multiple-Host Job
3.3. File Staging
참고자료
——————————————————————————–
1. 시작하기 [[목차]]
1.1. 환경 변수 설정 [[목차]]
시작하기 전에 자신의 .bashr 화일에 PBS 관련 환경 변수를 설정하여 둔자.
# vi ~/.bashrc
…
# PBS
export PATH=/usr/pbs/bin:/usr/pbs/sbin:$PATH
export PBS_SERVER_HOME=/usr/spool/PBS
export PBS_HOME=/usr/spool/PBS
export MANPATH=`man –path`:/usr/pbs/man
…
:wq
# source ~/.bashrc
1.2. 배치 작업을 위한 큐 관리 [[목차]]
PBS를 사용하기 전에 먼저 자주 사용되는 명령어를 몇 개 익혀 두도록 하자.
qalter 배치작업(job)의 속성을 변경한다. qdel 작업을 삭제한다. qhold 작업이 스케쥴링되어 실행되지 않도록 한다. hold 상태에 있게 된다. qmove 작업을 다른 큐나 서버로 옮긴다. qmsg 실행중인 작업의 출력 다음에 메시지가 출력되도록 한다. qrerun 실행중인 작업을 강제 종료하고, 다시 큐로 돌려보낸다. qrls Remove a hold from a job. qselect 특정한 조건을 만족시키는 작업의 리스트를 얻는다. qsig 실행중인 작업에 특정 시그널을 보낸다.
자세한 것은 아래의 man 페이지를 참조하도록 하자.
qalter, qdel, qhold, qmove, qmsg, qrerun, qrls, qselect, qsig
1.3. Hello World [[목차]]
간단한 작업을 큐에 넣고 실행결과를 얻는 방법을 알아 보자.
주의>> root 권한으로는 작업을 submit 할 수 없다.
$ vi hello
#!/bin/sh
echo Hello World
:wq
$ qsub hello
1.sdd114.foo.bar.com
$ ls -la
-rw-rw-r– 1 sangwan sangwan 36 Oct 14 22:05 hello
-rw——- 1 sangwan sangwan 0 Oct 14 22:07 hello.e1
-rw——- 1 sangwan sangwan 32 Oct 14 22:07 hello.o1
$ cat hello.o1
Hello World
$
hello 라는 쉘 스크립트를 qsub 명령으로 큐에 넣어 실행결과를 확인하였다.
표준 출력(standard output)과 표준 에러 출력(standard error)이 각각
.o#, .e# 화일로 출력되었다. 여기서 #은 작업 ID를 의미하여 위의 예에서 1은
첫번째 작업임을 의미한다.
여기서 알수 있는 것은 PBS에서 ‘작업’은 어떤 쉘 스크립트로써 실제 작업을
조절하는 기능을 한다는 것을 알 수 있다. 또 표준 출력과 에러출력이
실행 호스트로 부터 리다이렉트되어 사용자에게 돌아온다는 것을 알수 있다.
참고>>
스크립트내에 #PBS 명령을 이용하면, 출력화일의 이름을 지정할 수 있다.
예)
$ cat job
#!/bin/sh
#PBS -e job.err
#PBS -o job.out
hostname
date
$ qsub job
95.sdd114.foo.bar.com
$ ls job.*
job.err job.out
#PBS 다음에 qsub 명령의 컴맨드라인 옵션을 써주면 된다.
따라서, 위의 예는 다음과 같이 실행하여도 된다.
$ qsub -e job.err -o job.out job
1.4. 작업 환경 변수 [[목차]]
qsub 명령은 특정한 환경 변수들을 작업에 넘겨준다.
예를 들어 HOME 이라는 환경 변수는 “PBS_O_” 라는 접두어가 붙어
PBS_O_HOME 라는 환경 변수로 작업에서 읽어 들일 수 있다.
그외에 다음과 같은 환경 변수를 추가적으로 제공한다.
PBS_O_HOST qsub 명령이 실행된 호스트의 이름 PBS_O_QUEUE 작업이 처음 제출되었던 큐의 이름 PBS_O_WORKDIR qsub 명령이 실행된 디렉토리의 절대경로 PBS_ENVIRONMENT 배치작업이면 PBS_BATCH로 인터렉티브 작업이면 PBS_INTERACTIVE로 할당된다. PBS_JOBID 배치시스템에서 할당해준 작업의 아이디 PBS_JOBNAME 사용자가 지정한 작업의 이름 PBS_NODEFILE 작업에 할당된 노드 리스트가 적혀 있는 화일의 이름 PBS_QUEUE 작업이 실행되고 있는 큐의 이름
PBS에서 제공하는 환경 변수를 읽기 위한 작업 스크립트를 작성해 보자.
$ vi env
#!/bin/sh
hostname
pwd
echo HOME=$PBS_O_HOME
echo PATH=$PBS_O_PATH
echo SHELL=$PBS_O_SHELL
echo PID=$$
echo PBS_O_HOST=$PBS_O_HOST
echo PBS_O_QUEUE=$PBS_O_QUEUE
echo PBS_O_WORKDIR=$PBS_O_WORKDIR
echo PBS_ENVIRONMEN=$PBS_ENVIRONMENT
echo PBS_JOBID=$PBS_JOBID
echo PBS_JOBNAME=$PBS_JOBNAME
echo PBS_NODEFILE=$PBS_NODEFILE
echo PBS_QUEUE=$PBS_QUEUE
:wq
$ qsub env
2.sdd114.foo.bar.com
$ ls env*
env env.e2 env.o2
$ cat env.o2
sdd105.foo.bar.com
/home/sangwan
HOME=/home/sangwan
PATH=/usr/pbs/bin:/usr/pbs/sbin:/usr/pbs/bin:/usr/pbs/sbin:/bin:/usr/bin:/usr/lo
cal/bin:/usr/X11R6/bin
SHELL=/bin/bash
PID=9126
PBS_O_HOST=sdd114.foo.bar.com
PBS_O_QUEUE=workq
PBS_O_WORKDIR=/home/sangwan/pbs
PBS_ENVIRONMEN=PBS_BATCH
PBS_JOBID=18.sdd114.foo.bar.com
PBS_JOBNAME=env
PBS_NODEFILE=
PBS_QUEUE=workq
참고> 위의 스크립트는 sh 쉘스크립트로 작성되었지만, 어떤 종류의 쉘 스크립트도
가능하다. env 의 perl 언어 버젼인 env.pl 은 다음과 같다.
$ cat env.pl
#!/usr/bin/perl
print `hostname`;
print `pwd`;
print “HOME=$ENV{‘PBS_O_HOME’}\\n”;
print “PATH=$ENV{‘PBS_O_PATH’}\\n”;
print “SHELL=$ENV{‘PBS_O_SHELL’}\\n”;
print “PID=$$\\n”;
print “PBS_O_HOST=$ENV{‘PBS_O_HOST’}\\n”;
print “PBS_O_QUEUE=$ENV{‘PBS_O_QUEUE’}\\n”;
print “PBS_O_WORKDIR=$ENV{‘PBS_O_WORKDIR’}\\n”;
print “PBS_ENVIRONMEN=$ENV{‘PBS_ENVIRONMENT’}\\n”;
print “PBS_JOBID=$ENV{‘PBS_JOBID’}\\n”;
print “PBS_JOBNAME=$ENV{‘PBS_JOBNAME’}\\n”;
print “PBS_NODEFILE=$ENV{‘PBS_NODEFILE’}\\n”;
print “PBS_QUEUE=$ENV{‘PBS_QUEUE’}\\n”;
실행결과는 위의 경우와 같다.
2. PBS 명령어 [[목차]]
2.1. Qmgr Command (batch system manager) [[목차]]
qmgr 명령은 배치 시스템 관리자를 위한 인터페이스 명령이다.
qmgr의 list나 print와 같은 명령은 일반 사용자도 사용이 가능하지만,
create나 delete와 같은 명령은 관리자 권한을 필요로 한다.
자세한 내용은 man qmgr을 참조하기 바란다.
1) 도움말 보기 [[목차]]
qmgr을 실행하고, 온라인 도움말을 보는 방법은 다음과 같다.
$ qmgr
Max open servers: 4
Qmgr: help
General syntax: command [object][@server] [name attribute[.resource] OP value]
To get help on any topic or subtopic, type help
Help is available on all commands and topics.
Available commands: active, create, delete, set, unset, list, print, quit
Other topics are attributes, operators, names, and values .
참고>> Qmgr 전체 도움말
2) 관리자 변경 [[목차]]
배치 시스템 관리자를 지정하기 위해 qmgr 명령을 이용해 보자.
root 권한으로 로그인한 다음 qmgr 명령을 실행한다.
# qmgr
Max open servers: 4
Qmgr: set server managers=sangwan@sdd114.foo.bar.com
Qmgr: quit
#
managers는 pbs_server의 속성(attribute)이며(man pbs_server_attributes 참조),
배치 시스템을 관리할 수 있는 관리자를 나타낸다. 이제 배치 시스템을 관리하기
위해 root로 권한을 가질 필요가 없게 되었다.
3) Qmgr 명령어의 기능 [[목차]]
qmgr 명령의 형식은 다음과 같다.
command server [names] ]
command queue [names] ]
command node [names] ]
(man qmgr 참조)
command는 다음과 같은 종류가 있다.
active(a) 활성화된 객체를 지정한다.
create(c) 새로운 객체를 생성한다.
delete(d) 큐 또는 노드를 제거한다.
set(s) 객체의 속성을 설정한다.
unset(u) 객체의 속성을 제거한다.
list(l) 객체에 설정되어 있는 속성들을 나열한다.
print(p) 큐 또는 서버의 속성을 출력한다.
print문의 출력은 qmgr의 입력으로도 이용될 수 있다.
몇가지 예를 들어 보자.
$ qmgr
Qmgr: print node sdd105
#
# Create nodes and set their properties.
#
# Create and define node sdd105
#
# create node sdd105 # unsuppored operation
set node sdd105 state = free
set node sdd105 ntype = cluster
Qmgr: print queue workq
#
# Create queues and set their attributes.
#
#
# Create and define queue workq
#
create queue workq
set queue workq queue_type = Execution
set queue workq enabled = True
set queue workq started = True
Qmgr: print server
#
# Create queues and set their attributes.
#
#
# Create and define queue workq
#
create queue workq
set queue workq queue_type = Execution
set queue workq enabled = True
set queue workq started = True
#
# Set server attributes.
#
set server scheduling = True
set server managers = sangwan@sdd114.foo.bar.com
set server default_queue = workq
set server log_events = 511
set server mail_from = adm
set server query_other_jobs = True
set server scheduler_iteration = 600
Qmgr: list node sdd105
Node sdd105
state = free
np = 1
ntype = cluster
Qmgr: list queue workq
Queue workq
queue_type = Execution
total_jobs = 0
state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0
enabled = True
started = True
Qmgr: list server
Server sdd114.foo.bar.com
server_state = Active
scheduling = True
total_jobs = 0
state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0
managers = sangwan@sdd114.foo.bar.com
default_queue = workq
log_events = 511
mail_from = adm
query_other_jobs = True
scheduler_iteration = 600
pbs_version = OpenPBS_2.3.16
다음과 같이 ‘print server’를 ‘p s’로 줄여서 쓸수 있다.
managers 라는 속성을 출력한다.
Qmgr: p s managers
#
# Set server attributes.
#
set server managers = sangwan@sdd114.foo.bar.com
쉘 프롬프트 상에서는 qmgr 에 -c 옵션을 주어 실행하여도 된다.
Qmgr: quit
$ qmgr -c “p s managers”
#
# Set server attributes.
#
set server managers = sangwan@sdd114.foo.bar.com
4) 새로운 큐 만들기 [[목차]]
qsub 명령에서 큐를 명시하지 않으면 작업이 default_queue에 들어가에 된다.
디폴트 큐를 만들어 보자.
참고>> command는 다음과 같이 줄여쓴다: create(c), set(s), print(p)
object는 다음과 같이 줄여쓴다: queue(q), server(s)
Qmgr: c q dque queue_type=execution
Qmgr: s s default_queue=dque
Qmgr: s q dque enabled=true
Qmgr: s q dque started=true
Qmgr: p s default_queue
#
# Set server attributes.
#
set server default_queue = dque
모든 큐에는 queue_type, enabled, started 속성이 설정되어 있어야 한다.
queue_type은 execution(e) 또는 routing(r)이 있다.
enabled가 true로 설정되어 있을 경우에만 작업을 큐에 넣을 수 있다.
started가 true로 설정되어 있을 경우, 실행 큐에 있는 작업들은 스케쥴링 되며,
라우팅 큐에 있는 작업들은 라우팅된다.
참고>>
라우팅 큐의 경우는 route_destinations 라는 속성도 설정되어 있어야 한다.
자세한 것은 man pbs_queue_attributes 를 참조하도록 하자.
새로 만든 큐가 동작하는지 알아보자.
$ vi sleep
#!/bin/sh
hostname
sleep 30
date
:wq
$ qsub sleep
$ qsub sleep
$ qstat
Job id Name User Time Use S Queue
—————- —————- —————- ——– – —–
49.sdd114 sleep sangwan 0 R dque
50.sdd114 sleep sangwan 0 R dque
$ qstat -f # -f 옵션을 주면 full status가 출력된다.
Job Id: 49.sdd114.foo.bar.com
Job_Name = sleep
Job_Owner = sangwan@sdd114.foo.bar.com
job_state = R
…
Job Id: 50.sdd114.foo.bar.com
Job_Name = sleep
Job_Owner = sangwan@sdd114.foo.bar.com
job_state = R
$
참고>> 작업의 상태는
E(exiting), H(held), Q(queued), R(running), S(suspend), T(transit), W(waiting)
을 의미한다.
2.2. 서버, 큐, 작업 속성 [[목차]]
1) 서버 속성(server attributes) [[목차]]
위에서 큐를 만들때 default_queue를 설정해 주었는데,
서버 속성으로 default_queue는 반드시 설정되어 있어야 한다.
그밖에 서버 속성으로 다음과 같은 것들이 있다.
(man pbs_server_attributes를 참조.)
acl_hosts 작업을 submit 할 수 있는 호스트의 리스트
acl_host_enable acl_hosts 설정을 사용하도록 설정한다.
예) 마스터 노드에서만 작업을 submit 할수 있게 설정하면 클라이언트에서
qsub 시 에러가 발생한다.
Qmgr: s s acl_hosts=sdd114.foo.bar.com
Qmgr: s s acl_host_enable=true
# hostname
sdd105
# qsub hello
pbs_iff: error returned: 15008
pbs_iff: Access from host not allowed, or unknown host
No Permission.
qsub: cannot connect to server sdd114 (errno=15007)
참고>> acl_hosts에 *.foo.bar.com 과 같이 와일드카드 문자를 사용할 수 있다.
query_other_jobs true로 설정되면 다른 사용자의 작업을 쿼리할 수 있다.
false이거나 설정되지 않으면 쿼리할 수 없다.
qstat에서 다른 사용자의 작업은 표시되지 않는다.
예)
현재 사용자가 dol 이고, query_other_jobs=false 인 경우
$ qstat
Job id Name User Time Use S Queue
—————- —————- —————- ——– – —–
56.sdd114 sleep dol 0 R dque
query_other_jobs=true 인 경우
$ qstat
Job id Name User Time Use S Queue
—————- —————- —————- ——– – —–
56.sdd114 sleep dol 0 R dque
57.sdd114 sleep sangwan 00:00:00 R dque
resources_defaults 작업에 할당된 자원을 제한한다. 이 것은 작업에 대해서
limit이 지정되지 않았고, 큐에 대해서도 limit이 지정되지
않았을 경우에만 적용된다.
형식은 “resources_default.resource_name=value[,…]”;
resources_max 작업이 요청할 수 있는 최대의 자원의 양을 지정한다.
형식은 “resources_max.resource_name=value[,…]”;
위에서 resource_name은 cput(최대 CPU 시간), file(생성 가능한 최대 화일 크기),
nice(작업이 실행될 수 있는 최대 nice값), pcput(단일 프로세스가 사용할 수 있는
최대 CPU 시간), pmem(단일 프로세스가 사용가능한 최대 물리적 메모리),
pvmem(단일 프로세스가 사용가능한 최대 가상 메모리), vmem(모든 프로세스가
사용할 수 있는 가상메모리의 합계), walltime(작업이 실행 상태에 머무를 수 있는
최대 시간), arch(시스템 아키택쳐), host(작업이 실행 되는 호스트의 이름),
nodes(작업에 단독적으로 할당되는 노드의 개수)등이 있고 이것에 대한 설명은
man pbs_resources를 참고하자.
예)
서버의 resources_max.walltime 을 20초로 제한 하면, 실행중이던 작업이
중단된다.
$ qmgr -c “set server resources_max.walltime=20”
$ echo sleep2
#!/bin/sh
date; sleep 10; date; sleep 10 date; sleep 10
date; sleep 10; date; sleep 10 date; sleep 10
date; sleep 10; date; sleep 10 date; sleep 10
date; sleep 10; date; sleep 10 date; sleep 10
date; sleep 10; date; sleep 10 date; sleep 10
date;
$ qsub sleep2
68.sdd114.foo.bar.com
$ cat sleep2.e68
=>> PBS: job killed: walltime 30 exceeded limit 20
$ cat sleep2.o68
Tue Oct 15 16:28:33 KST 2002
Tue Oct 15 16:28:43 KST 2002
Tue Oct 15 16:28:53 KST 2002
$
resources_defaults와 resources_max 속성은 서버뿐만 아니라 작업과 큐에도
존재한다. 작업의 자원 제한량은 다음 순서로 결정된다:
(1) 사용자가 요청한 작업의 Resource_List
(2) 큐의 resources_default 속성
(3) 서버의 resources_default 속성
(4) 큐의 resources_max 속성
(5) 서버의 resources_max 속성
$ qmgr -c “s s resources_max.walltime=24:00:00”; \\
qmgr -c “s q dque resources_max.walltime=1:00:00”; \\
qmgr -c “s s resources_default.walltime=2:00:00”; \\
qmgr -c “s q dque resources_default.walltime=0:30:00”
위와 같이 설정을 하면 dque 에 대해서 최대 실행시간 30초가 적용된다.
설정된 값을 지우려면 다음과 같이 하면 된다:
$ qmgr -c “u s resources_max.walltime”; \\
qmgr -c “u q dque resources_max.walltime”; \\
qmgr -c “u s resources_default.walltime”; \\
qmgr -c “u q dque resources_default.walltime”
값이 설정되지 않았을 때는 unlimit 가 적용된다.
서버의 속성에는 다음과 같은 것들이 있다: (man pbs_server_attributes 참조)
acl_host_enable, acl_hosts, acl_user_enable, acl_users, acl_roots, comment,
default_node, default_queue, log_events, mail_uid, managers, max_running,
max_user_run, max_group_run, node_pack, operators, query_other_jobs,
resources_available, resources_cost, resources_default, scheduler_iteration,
scheduling, system_cost
2) 큐 속성(queue attributes) [[목차]]
큐의 속성에는 다음과 같은 것들이 있다: (man pbs_queue_attributes 참조)
acl_group_enable, acl_groups, acl_host_enable, acl_hosts, acl_user_enable,
acl_users, enabled, from_route_only, max_queuable, max_running, Priority,
queue_type, resources_max, resources_min, resources_default, started
다음 속성은 실행 큐에만 적용된다:
checkpoint_min, resources_available, kill_delay, max_user_run, max_group_run
다음 속성은 라우팅 큐에만 적용된다:
route_destination, alt_router, route_held_jobs, route_waiting_jobs,
route_retry_time, route_lifetime
3) 작업 속성(job attributes) [[목차]]
배치 작업은 다음과 같은 속성을 가진다: (man pbs_job_attributes 참조)
Account_Name, Checkpoint, depend, Error_Path, Execution_Time, group_list,
Hold_Types, Job_Name, Join_Path, Keep_Files, Mail_Points, Mail_Users,
Output_Path, Priority, Rerunable, Resource_List, Shell_Path_List, stagein,
stateout, User_List, Variable_List
다음 변수를 변경하려면 시스템 관리자의 권한이 필요하다:
comment, sched_hint, alt_id, ctime, etime, exec_host, egroup, euser,
hashname, interactive, Job_Owner, job_state, mtime, qtime, queue,
queue_rank, queue_type, resources_used, server, session_id, substate
3. 작업 실행 예제 [[목차]]
3.1. Single-Host Job [[목차]]
1) 예제
소수(prime number)를 출력하기 위한 다음과 같은 프로그램이 있다고 해보자.
소스코드 : prime.c
$ ./prime 1 100 # 1에서 100사이의 소수를 출력한다.
prime numbers betwen [1, 100]
1: 1 is a prime number
2: 2 is a prime number
3: 3 is a prime number
4: 5 is a prime number
…
24: 83 is a prime number
25: 89 is a prime number
26: 97 is a prime number
$
이것을 PBS 작업으로 실행시키기 위해서는 작업 스크립트를 작성하여야 한다.
$ vi prime.sh
#!/bin/sh
#PBS -l nodes=1 # 실행중인 노드를 execlusive 하게 이용하기 위해 넣어준다.
#PBS -m abe # 작업이 중단(abort), 시작(begin), 종료(end)될때
#PBS -M sangwan@foo.bar.com # 사용자에게 메일을 보낸다
hostname
date # 실행 시작 시간
$PBS_O_WORKDIR/prime 1 1000000
date # 실행 종료 시간
:wq
$ qsub prime.sh
87.sdd114.foo.bar.com
$ ls -la prime.sh.o87
-rw——- 1 sangwan sangwan 5239 Oct 15 18:37 prime.sh.o87
$ cat prime.sh.o87
sdd105.foo.bar.com
Wed Oct 16 18:01:07 KST 2002
prime numbers betwen [1, 1000000]
1: 1 is a prime number
2: 2 is a prime number
…
78498: 999979 is a prime number
78499: 999983 is a prime number
Wed Oct 16 18:01:18 KST 2002
2) 여러개를 한꺼번에 실행하기
$ cat prime.one.sh
#!/bin/sh
#PBS -l nodes=1
hostname
$PBS_O_WORKDIR/prime 1 1000000 # 1 부터 1000000 까지 소수를 출력
$ cat prime.two.sh
#!/bin/sh
#PBS -l nodes=1
hostname
$PBS_O_WORKDIR/prime 1000001 2000000 # 1000001부터 2000000 까지 소수를 출력
$ cat prime.three.sh
#!/bin/sh
#PBS -l nodes=1
hostname
$PBS_O_WORKDIR/prime 2000001 3000000 # 2000001 부터 3000000 까지 소수를 출력
$ qsub prime.one.sh ; qsub prime.two.sh ; qsub prime.three.sh
$ qstat
Job id Name User Time Use S Queue
—————- —————- —————- ——– – —–
135.sdd114 prime.one.sh sangwan 0 R workq
136.sdd114 prime.two.sh sangwan 0 R workq
137.sdd114 prime.three.sh sangwan 0 R workq
$ pbsnodes -a
sdd105
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/135.sdd114.foo.bar.com
sdd106
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/136.sdd114.foo.bar.com
sdd107
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/137.sdd114.foo.bar.com
3.2. Multiple-Host Job [[목차]]
1) 예제
원주율을 구하는 다음과 같은 프로그램이 있다고 해보자. 이 프로그램은 mpich로 컴파일된 프로그램이다.
$ ./cpi
Process 0 on sdd114.foo.bar.com
pi is approximately 3.1416009869231254, Error is 0.0000083333333323
wall clock time = 0.000096
$
이것을 PBS 작업으로 실행시키기 위해서는 작업 스크립트를 작성하여야 한다.
$ vi test.sh
#!/bin/sh
#PBS -l nodes=3 # 실행중인 노드를 execlusive 하게 이용하기 위해 넣어준다.
hostname
cat $PBS_NODEFILE
NPROCS=`wc -l < $PBS_NODEFILE` #프로세서의 수를 정의한다.
date # 실행 시작 시간
/usr/local/mpich/bin/mpirun -v -machinefile $PBS_NODEFILE -np $NPROCS $PBS_O_WORKDIR/cpi
sleep 10
date # 실행 종료 시간
$ :wq
$ qsub test.sh
217.sdd114.foo.bar.com
$ qstat -n
sdd114.foo.bar.com:
Req’d Req’d Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
————— ——– ——– ———- —— — — —— —– – —–
217.sdd114.foo. wthong dque test.sh 23187 3 — — — R —
sdd107/0+sdd106/0+sdd105/0
$ pbsnodes -a
sdd105
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/217.sdd114.foo.bar.com
sdd106
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/217.sdd114.foo.bar.com
sdd107
state = job-exclusive
np = 1
ntype = cluster
jobs = 0/217.sdd114.foo.bar.com
$ ls -la test.sh.o217
-rw——- 1 wthong wthong 292 Dec 26 10:12 test.sh.o217
$ cat test.sh.o217
sdd107.foo.bar.com
sdd107
sdd106
sdd105
Thu Dec 26 09:54:50 KST 2002
running /home/wthong/pbs_test/cpi on 3 LINUX ch_p4 processors
Created /AUTOFS/home/wthong/PI23221
pi is approximately 3.1416009869231249, Error is 0.0000083333333318
wall clock time = 0.000371
Thu Dec 26 09:55:01 KST 2002
3.3. File Staging [[목차]]
1) 예제
소수(prime number)를 출력하기 위한 다음과 같은 프로그램이 있다고 해보자.
소스코드 : prime2.c
$ cat inputfile
2
52
19841
19927
119891
1000031
1000037
2000671
$ ./prime2 inputfile # inputfile에서 숫자를 읽어 소수인지 검사한다
2 is a prime number
52 is not a prime number
19841 is a prime number
19927 is a prime number
119891 is a prime number
1000031 is not a prime number
1000037 is a prime number
2000671 is a prime number
$
이 경우 입력화일이 실행노드에 복사되어야 하므로 -W stagein 옵션을
추가해야 한다. 형식은 다음과 같다.
형식: -W stagein:local_file@remote_host:remote_file
주의 할 점은 local_file은 계산 노드에 복사될 화일의 이름을 나타내고,
remote_host:remote_file은 계산노드에서 볼때, 복사해올 화일이 있는
호스트와 경로가 된다. local_file과 remote_file에서 상대 경로를 사용하면
사용자의 홈디렉토리가 기준이 된다.
$ vi prime2.sh
#!/bin/sh
#PBS -l nodes=1 # 실행중인 노드를 execlusive 하게 이용하기 위해 넣어준다.
# homenode의 /home/sangwan/prime/inputfile을 /tmp/inputfile로 복사한다.
#PBS -W stagein=/tmp/inputfile@homenode:/home/sangwan/prime/inputfile
hostname
date
$PBS_O_WORKDIR/prime2 /tmp/inputfile
date
:wq
$ qsub prime2.sh
$ cat prime2.sh.o2121
sdd105.foo.bar.com
Mon Dec 30 11:51:07 KST 2002
2 is a prime number
52 is not a prime number
19841 is a prime number
19927 is a prime number
119891 is a prime number
1000031 is not a prime number
1000037 is a prime number
2000671 is a prime number
Mon Dec 30 11:51:07 KST 2002
참고>> Stage-in된 화일들은 작업이 끝나면 자동으로 삭제된다.
Stage-out의 경우도 비슷한 방법으로 동작한다.
작업 스크립트에서
#PBS -W stageout=/tmp/outputfile@homenode:/home/sangwan/prime/outputfile
와 같이 써주면 계산노드의 실행결과 생성된 화일인 /tmp/outputfile이
homenode의 지정된 화일로 복사된다.
참고자료 [[목차]]
1. Portable Batch System Administrator Guide (Release 2.3)
http://www.openpbs.org/docs.html
2. PBS(Portable Batch System) 설치하기
3. PORTABLE BATCH SYSTEM (PBS) MINI-HOWTO
http://www.fysik.dtu.dk/CAMP/pbs.html
4. Archive of pbs-users mail list By Thread
http://www.openpbs.org/UserArea/pbs-users/thread.html
5. MAN 페이지
– qalter, qdel, qhold, qmove, qmsg, qrerun, qrls, qselect, qsub, qsig, qmgr
– pbs_server_attributes, pbs_queue_attributes, pbs_job_attributes
– pbs_resources
-EOF- PBS(Portable Batch System) 관리자 및 사용자 튜토리얼 [[TOP]]