목차
1. Job Script 만들기
2. Job 실행 (qsub)
3. 실행중인 Job 확인 (qstat)
4. 실행중인 Job 삭제 (qdel)
5. Host Server info 확인
6. Job 큐 추가 및 삭제
7. 특정 node 비활성화
8. 확인 명령어
9. 자주 발생하는 Error들
1. Job Script 만들기
PBS Job Script는 (1) shebang line, (2) PBS command, (3) Job 총 3가지 부분으로 이루어집니다.
Shebang line 은 작업 스크립트의 쉘 또는 인터프리터를 설정하는 부분으로 보통 sh 또는 bash 와 같은 쉘이나 python 과 같은 인터프리터를 사용할 수 있습니다.
#PBS로 시작되는 PBS command는 job script에 대한 환경을 설정하기 위해 사용됩니다.
그리고 마지막으로 수행할 job의 내용을 적어주면 job script는 완성됩니다.
실행할 job의 관리를 쉽게 하기 위해서 PBS command에 대해 자세히 알아볼 필요가 있습니다.
Command | Explanation |
---|---|
-N {jobname} | job name을 지정, 지정 시 job list에서 확인하기 용이함. |
-o {path} | 표준 출력(stdout)이 쓰일 경로를 지정 |
-e {path} | 표준 에러(stderr)가 쓰일 경로를 지정 |
-q {queue} | 작업을 제출할 큐(queue)를 지정 |
-j oe | 표준 출력(stdout)에 표준 에러(stderr)를 통합시킨다. 그 반대는 ‘eo’ |
-l ncpus={n} | 병렬처리 작업일 경우, 이용하고자 하는 코어의 개수를 지정할 수 있다. |
한 대의 노드에서 실행되는 작업의 수를 제한해야 하는 일이 생길 수 있습니다.
이 때에는 작업 당 할당시킬 수 있는 cpu 개수를 지정해 주면 노드에서 제한된 수의 작업만 실행되게 할 수 있습니다.
다음과 같이 자원을 제한할 수 있는 limitation (-l) 옵션을 통해 cpu 의 개수를 4로 해 놓으면,
4개의 코어를 가진 노드에서는 한 개의 작업만 실행되게 됩니다. -l ncpus=4
예시
vi test.sh # shell script인 test sh파일을 만든다.
#!/bin/sh # shebang line 작성
#PBS -N testjob1 # testjob1이라는 job의 name 설정
#PBS -O /home/dong/test.txt # 작업이 실행되면서 출력되는 표준 출력은 /home/dong 폴더에 test.txt파일로 저장
#PBS -l ndoes=1:ppn=4 # 하나의 노드 (nodes), 프로세서 (ppn) 4개에 할당
cd #PBS_O_WORKDIR # 스크립트가 실행할 디렉토리로 이동
python3 test.py # test.py를 python3로 실행
이 때 주의할 점은 ‘#PBS’의 #은 주석이 아니기 때문에 반드시 ‘#PBS’로 입력하고 명령어를 입력해야 한다.
‘cd #PBS_O_WORKDIR’의 경우, qsub를 실행할 위치로 이동해주는 것이므로,
만약 하위코드에서 절대경로가 아닌, ‘상대경로’를 입력한 경우 이 명령어를 넣지 않으면 스크립트가 오작동 할 수 있다.
메모리가 충분하지 않을 경우에는 한 대의 노드에서 실행되는 작업의 수를 제한해야 하는 일이 생길 수 있습니다.
이 때 작업 당 할당시킬 수 있는 cpu 개수를 지정해 주면 노드에서 제한된 수의 작업만 실행되게 할 수 있습니다.
다음과 같이 자원을 제한할 수 있는 limitation (-l) 옵션을 통해 cpu 의 개수를 4로 해 놓으면,
4개의 코어를 가진 노드에서는 한 개의 작업만 실행되게 됩니다. -l ncpus=4
2. Job 실행 (qsub)
이제 만든 job script를 job scheduler에게 맡겨 실행시켜야 합니다. 이 과정을 job 실행이라고 합니다.
job 실행은 qsub 명령을 통해 이루어집니다. qsub의 첫 번째 인수에 위에서 만든 작업 스크립트 파일 이름을 적어줍니다.
그러면 다음과 같이 {작업 번호}.{호스트명}의 포맷으로 작업이 제출되었다는 표시가 나타납니다.
작업 번호는 0부터 시작하며 작업이 제출될 때마다 1씩 증가하여 최대 9,999,999까지 부여됩니다.
9,999,999 이후의 작업 번호는 다시 0부터 시작합니다.
PBS job scheduler를 설치한 이후 처음으로 제출하는 job이면 job 번호는 0번이 지정됩니다.
$ qsub test.sh
0.testjob1
선행 job이 종료된 후 다른 job이 실행되도록 하려면…
이럴 때에는 작업들 사이의 의존성 관계를 설정해주면 됩니다.
예를 들어, A 라는 작업이 먼저 끝난 후 B 라는 작업이 실행되게 하고 싶을 때가 있습니다.
이 때에는 B 라는 작업을 제출할 때 A 라는 작업이 끝난 후에 실행되게 하라는 의존성 관계를 설정해주어야 합니다.
이 때에는 qsub command의 “-W depend=” 옵션을 이용해 제출하면 됩니다.
아래는 A 작업을 먼저 제출하고 작업 번호로 1.testjob1 임을 이용하여 후 B 작업을 제출할 때 이를 의존성 관계로 설정하여 제출하는 것을 보여줍니다.
$ qsub test_a.sh
1.lab612
$ qsub -W depend=afterok:1.lab612 test_b.sh
2.lab612
또한 의존성 관계의 설정에서는 여러 개의 job을 넣어줄 수도 있습니다.
예를 들어, A, B, C 라는 작업이 끝난 이후에 D 라는 작업이 실행되게 하고 싶을 경우입니다.
주로 개별 샘플에 대해 작업을 실행한 후 총 합계를 구하거나 병합을 해야하는 작업에 주로 사용됩니다.
A, B, C 작업 번호가 각각 3.testjob1, 4.testjob1, 5.testjob1 라고 할 때,
이들 이름을 콜론(:)으로 연결해 주기만 하면 됩니다.
$ qsub -W depend=afterok:3.lab612 :4.lab612 :5.lab612 test_d.sh
6.lab612
3. 실행중인 Job 확인 (qstat)
실행되고 있는 job들이 제출과 동시에 실행(running)이 되는지 아니면 대기상태(pending)에 있는지 확인하는 방법입니다.
해당 방법은 “qstat” command 를 통해 가능합니다.
$ qstat
Job id Name User Time Use S Queue
---------------- ---------------- ---------------- -------- - -----
0.lab612 testjob1 dong 0 Q workq
만약 작업 큐 별로 요약된 정보를 보고싶다면 -Q 옵션을 추가적으로 주면 됩니다.
$ qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext Type
---------------- ----- ----- --- --- ----- ----- ----- ----- ----- ----- ----
workq 0 1 yes yes 1 0 0 0 0 0 Exec
4. 실행중인 Job 삭제 (qdel)
job을 제출한 후 job script의 내용이 일부 잘못되거나 원치 않는 내용이 포함되어있는 것을 알게 된 경우가 존재합니다.
이때 job이 모두 종료될 때 까지 기다리는 것은 자원과 시간의 낭비로 이어지게 되므로 작업 취소를 해주어야 합니다.
이 때에는 qdel 명령이 사용됩니다. qdel의 첫 번째 인수로 작업의 고유번호(job id)를 입력해 줍니다.
$ qdel 0.lab612
여러 개의 작업들을 한꺼번에 삭제할 수도 있습니다. 다음은 10개의 작업을 한꺼번에 삭제하는 명령입니다.
$ qdel {0..9}.lab612
5. Host Server info 확인
job 큐에 대한 정보 뿐만 아니라 호스트에 대한 정보를 볼 때 “qstat” command를 사용합니다.
작업 단위가 아니라 호스트 서버 단위의 정보를 보려면 “-B” (batch server status) 옵션을 주어야 합니다.
$ qstat -B
Server Max Tot Que Run Hld Wat Trn Ext Status
---------------- ----- ----- ----- ----- ----- ----- ----- ----- -----------
lab612 0 1 0 0 0 0 0 0 Active
만약 더욱 자세한 정보를 보고 싶다면 qstat -Bf 명령을 이용하면 됩니다.
$ qstat -Bf
Server: lab612
server_state = Active
server_host = dong
scheduling = True
total_jobs = 1
...
eligible_time_enable = False
job_history_enable = True
max_concurrent_provision = 5
6. Job 큐 추가 및 삭제
작업 큐를 추가하고 삭제하는 방법은 “qmgr” command로 가능합니다.
이는 사용자보다는 주로 서버 관리자가 사용하게 됩니다.
일반 사용자 계정으로는 명령의 제한이 있는 경우가 있으므로 주로 root 권한을 획득하여 작업하는 것이 일반적입니다.
qmgr 에서 사용하는 명령어 줄임 표현
- 명령어(command): create(c), delete(d), set(s), unset(u), list(l), print(p)
- 오브젝트(object): server(s), node(n), queue(q)
7. 특정 node 비활성화
때때로 특정 노드가 제대로 작동하지 않거나 문제가 생긴 경우, 작업 스케쥴러에서 사용하지 않도록 하는 방법이 있습니다.
노드의 메인보드가 나가거나 메모리 이상으로 인해 작업이 제대로 할당되지 않거나, 할당 되더라도 계산 속도가 다른 노드들에 비해 현저히 낮아지는 경우 등입니다.
root 권한을 이용하여 다음과 같이 입력하면 노드를 비활성화 시킬 수 있습니다.
# pbsnodes -o node8
비활성화 되어 있는 노드를 다시 복구 시키려면 다음과 같이 입력합니다.
# pbsnodes -c node8
이렇게 활성화 또는 비활성화 시킨 노드들이 제대로 적용되었는지 확인하려면 다음과 같이 노드들의 리스트 상태를 볼 수 있습니다.
$ pbsnodes -l
node8 down,offline
node14 state-unknown,down node down: communication closed
node17 offline
node25 down,offline
8. 확인 명령어
qsub 의 버전 및 경로 확인하기
[root@lab612 ~]$ qsub --version
pbs_version = 14.1.2
[root@sirna1 ~]$ which qsub
/opt/pbs/bin/qsub
/opt/pbs/bin 폴더에 들어있는 실행파일들
[lab@lab612 ~]$ cd /opt/pbs/bin
[lab@lab612 bin]$ ls -a *
mpiexec pbs_mpihp pbs_remsh pbs_tmrsh qdel qorder qstat
nqs2pbs pbs_mpilam pbs_rstat pbs_topologyinfo qdisable qrerun qstop
pbs_attach pbs_mpirun pbs_rsub pbs_wish qenable qrls qsub
pbsdsh pbsnodes pbsrun printjob qhold qrun qterm
pbs_hostn pbs_password pbsrun_unwrap printjob.bin qmgr qselect tracejob
pbs_lamboot pbs_python pbsrun_wrap printjob_svr.bin qmove qsig
pbs_migrate_users pbs_rdel pbs_tclsh qalter qmsg qstart
노드 리스트 확인하기
[root@lab612 ~]# wwsh node list
NAME GROUPS IPADDR HWADDR
================================================================================
mirna1 newnodes 192.168.10.253 00:1b:21:d7:xx:xx
mirna2 newnodes 192.168.10.252 00:1b:21:d7:xx:xx
node1 newnodes 192.168.10.1 00:1b:21:d7:xx:xx
...
node9 newnodes 192.168.10.9 00:1b:21:d5:xx:xx
9. 자주 발생하는 Error들
No such file or directory: 작업 스크립트를 찾을 수 없는 경우
$ qsub non-existent.sh
qsub: script file:: No such file or directory
Job has finished: 제출되었다가 삭제되었거나 이미 끝난 작업을 삭제하려고 할 때
$ qdel 0.lab612
qdel: Job has finished
Unknown Job Id: 제출된 적이 없는 작업을 삭제하려고 할 때
$ qdel 9999.lab612
qdel: Unknown Job Id 9999.lab612
illegally formed job identifier: 작업 번호는 지정했지만 잘못된 호스트 이름을 입력했을 경우
$ qdel 0.lab6122
qdel: illegally formed job identifier: 0.lab612
Error (15007) returned from server: 큐를 생성할 수 있는 사용자가 아닌 경우
[lab@lab612 ~]$ qmgr
Max open servers: 49
Qmgr: create queue optiplex
qmgr obj=optiplex svr=default: Unauthorized Request
qmgr: Error (15007) returned from server
Server disconnected due to idle connection timeout: 오랜시간 동안 qmgr 프롬프트에서 입력이 없는 경우
[root@lab612 lab]# qmgr
Max open servers: 49
Qmgr: create queue optiplex
Qmgr: set queue optiplex queue_type = execution
qmgr obj=optiplex svr=default: End of File
qmgr: Server disconnected due to idle connection timeout
존재하지 않는 속성 값을 부여하려고 할 때
[root@lab612 lab]# qmgr
Max open servers: 49
Qmgr: set queue optiplex unkattr = True
qmgr obj=optiplex svr=default: Undefined attribute
qmgr: Error (15002) returned from server
PBS 의 qsub 은 help 옵션이 따로 없는 듯 하다. 잘못된 옵션을 입력하여 옵션 리스트를 볼 수 밖에 없다.
[lab@lab612 ~]$ qsub --help
qsub: invalid option -- '-'
usage: qsub [-a date_time] [-A account_string] [-c interval]
[-C directive_prefix] [-e path] [-f ] [-h ] [-I [-X]] [-j oe|eo] [-J X-Y[:Z]]
[-k o|e|oe] [-l resource_list] [-m mail_options] [-M user_list]
[-N jobname] [-o path] [-p priority] [-P project] [-q queue] [-r y|n]
[-S path] [-u user_list] [-W otherattributes=value...]
[-v variable_list] [-V ] [-z] [script | -- command [arg1 ...]]
qsub --version