[클러스터] 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]]

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.