LSF HPC Suite의 좋은 점 중 하나는 LSF Data Manager가 포함되어 있다는 것입니다. 바로 전 posting에서 올린 방법대로 ansible-playbook으로 설치하면 LSF Data Manager도 자동으로 설치됩니다.
LSF Data Manager와 관련한 설정 파일들은 아래와 같은 것들이 있습니다. 기본적으로는 별도로 수정할 필요는 없습니다만, 딱 하나, lsf.datamanager.<cluster_name> 파일에서 STAGING_AREA는 cluster 내의 모든 서버들이 access 할 수 있는 NFS나 GPFS로 바꾸어주셔야 합니다.
[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsbatch/myCluster/configdir/lsb.queues
...
Begin Queue
QUEUE_NAME = dataq
PRIORITY = 33
DATA_TRANSFER = Y
HOSTS = p628-kvm1
End Queue
[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsf.conf
...
LSB_RESOURCE_ENFORCE="memory cpu gpu"
LSF_DATA_PORT=9998
LSF_DATA_HOSTS="p628-kvm1"
LSF_SERVER_HOSTS="p628-kvm1"
LSF_GPU_AUTOCONFIG=Y
LSB_GPU_NEW_SYNTAX=extend
[cecuser@p628-kvm1 ~]$ sudo vi /opt/ibm/lsfsuite/lsf/conf/lsf.datamanager.myCluster
...
Begin Parameters
ADMINS = lsfadmin
#STAGING_AREA = /opt/ibm/lsfsuite/lsf/work/myCluster/staging
STAGING_AREA = /home/staging
# CACHE_INPUT_GRACE_PERIOD = 1440
# CACHE_OUTPUT_GRACE_PERIOD = 180
# CACHE_PERMISSIONS = user
# QUERY_NTHREADS = 4
# REMOTE_CACHE_REFRESH_INTERVAL = 15
End Parameters
위에서 지정된 /home/staging은 아래와 같이 NFS export된 directory로서, 아래와 같이 p628-kvm2,3 서버에도 같은 이름으로 mount 되어 있습니다.
[cecuser@p628-kvm1 ~]$ cat /etc/exports
/home/staging p628-kvm2(rw,sync,no_subtree_check) p628-kvm3(rw,sync,no_subtree_check)
[cecuser@p628-kvm2 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 94G 9.2G 81G 11% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 32M 16G 1% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
tmpfs 3.2G 0 3.2G 0% /run/user/1000
p628-kvm1:/home/staging 94G 15G 75G 17% /home/staging
tmpfs 3.2G 0 3.2G 0% /run/user/0
그리고 위와 같이 lsf.datamanager.myCluster 일부 내용을 수정한 경우, 다음과 같이 반드시 bdata admin reconfig 명령을 수행해주어야 그 변경이 효과를 냅니다. 그 외에도, 일부 옵션의 경우 lsf 자체를 restart 해야 하는 경우도 있으니 lsadmin limrestart 명령과 badmin mbdrestart 명령도 해주는 것이 좋습니다.
[cecuser@p628-kvm1 ~]$ su
Password:
bash-4.2# bdata admin reconfig
Checking configuration files ...
No errors found.
LSF data manager daemon (dmd) on <p628-kvm1> is reconfiguring ... initiated.
bash-4.2# lsadmin limrestart
bash-4.2# badmin mbdrestart
이제 설정을 확인하면 아래와 같이 STAGING_AREA가 변경된 것을 보실 수 있습니다.
[cecuser@p628-kvm1 ~]$ bdata showconf
LSF data management configuration at Thu Apr 2 02:30:30 2020
ADMINS = lsfadmin
CACHE_ACCESS_CONTROL = N
CACHE_ACCESSIBLE_FILES = N
CACHE_INPUT_GRACE_PERIOD = 1440 (minutes)
CACHE_OUTPUT_GRACE_PERIOD = 180 (minutes)
CACHE_PERMISSIONS = user
CACHE_REFRESH_INTERVAL = 15 (minutes)
FILE_TRANSFER_CMD = /usr/bin/scp
LSB_TIME_DMD = 0
LSF_DATA_BSUB_CHKSUM = N
LSF_DATA_HOSTS = p628-kvm1
LSF_DATA_PORT = 9998
LSF_LOGDIR = /opt/ibm/lsflogs
LSF_LOG_MASK = LOG_WARNING
PERMISSION_MASK = 000
QUERY_NTHREADS = 4
REMOTE_CACHE_REFRESH_INTERVAL = 15 (seconds)
STAGING_AREA = /home/staging
[cecuser@p628-kvm1 ~]$ bdata connections
LOCAL: (LSF_DATA_PORT=9998)
LSF_DATA_HOSTS
[*]p628-kvm1
CLUSTER MASTER STATUS
myCluster p628-kvm1 ok
이제 간단히 LSF Data Manager의 동작을 테스트해보겠습니다. 먼저 data file을 하나 만듭니다.
[cecuser@p628-kvm1 ~]$ echo "beef jerky" > /tmp/test1.txt
그리고 수행할 job script를 하나 작성합니다. 여기서는 먼저 p628-kvm1 서버의 /tmp/test1.txt 파일을 stage in 한 뒤에 그걸 cat 하는 동작을 해보겠습니다.
[cecuser@p628-kvm1 ~]$ cat job1.sh
bstage in -src p628-kvm1:/tmp/test1.txt
cat test1.txt
이 script가 p628-kvm2 서버에서 수행되도록 해보겠습니다. 분명히 아직 p628-kvm2 서버에는 job1.sh script도, test1이라는 data file도 없습니다.
[cecuser@p628-kvm2 ~]$ pwd
/home/cecuser
[cecuser@p628-kvm2 ~]$ ls
support-scripts
이제 다음과 같이 -m 옵션을 써서 p628-kvm2 서버에서 p628-kvm1 서버의 /tmp/test1.txt 파일을 cat 명령으로 읽는 동작을 수행하겠습니다.
[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm2 -data "p628-kvm1:/tmp/test1.txt" < job1.sh
Job <465> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm2.cecc.ihost.com>>
beef jerky
위와 같이 잘 되는 것을 보실 수 있는데, 수행 뒤에 p628-kvm2 서버에 가보면 실제로 test1.txt가 p628-kvm2 서버의 current working directory (CWD)에 복사되어 있는 것을 보실 수 있습니다.
[cecuser@p628-kvm2 ~]$ ls -l
total 8
drwxr-xr-x. 2 cecuser cecuser 4096 Apr 5 03:15 support-scripts
-rw-r--r--. 1 cecuser cecuser 11 Apr 6 01:07 test1.txt
이 LSF Data Manager를 이용해서 각 서버에 장착된 고속 NVMe flash drive를 burst buffer처럼 사용하는 방안에 대해서 살펴보겠습니다.
먼저 각 서버에 고속 NVMe flash drive가 공유되지 않은 일반 directory인 /nvme로 mount되어 있다고 가정해보겠습니다.
[cecuser@p628-kvm1 ~]$ ls -l /nvme
total 0
[cecuser@p628-kvm2 ~]$ ls -l /nvme
total 0
[cecuser@p628-kvm3 ~]$ ls -l /nvme
total 0
그리고 data source는 p628-kvm1 서버의 /tmp/data1 밑에 들어있다고 가정하시지요.
[cecuser@p628-kvm1 ~]$ ls -l /tmp/data1
total 12
-rw-rw-r--. 1 cecuser cecuser 6 Apr 6 02:08 1.txt
-rw-rw-r--. 1 cecuser cecuser 8 Apr 6 02:08 2.txt
-rw-rw-r--. 1 cecuser cecuser 6 Apr 6 02:09 3.txt
[cecuser@p628-kvm1 ~]$ cat /tmp/data1/*.txt
donut
biscuit
bagel
Linux의 paste라는 명령어를 이용하여 이 파일들을 하나로 합쳐서 화면으로 뿌려주는 일을 해보겠습니다. 단, 이 파일들을 합치기 전에 먼저 p628-kvm1~3의 3대 서버 중 한 대의 고속 I/O인 /nvme로 stage-in 해놓은 뒤에 paste 명령을 쓰는 것으로 하겠습니다.
이떄 사용할 것은 bsub 명령어 중 -cwd (current working directory) 옵션입니다. 이 옵션을 써서 각 서버의 /nvme를 현재 작업 directory로 지정할 수 있습니다.
즉, 다음과 같이 하면 됩니다. 먼저 수행할 script를 아래와 같이 작성합니다.
[cecuser@p628-kvm1 ~]$ cat paste.sh
bstage in -src p628-kvm1:/tmp/data1/*
cd data1
paste 1.txt 2.txt 3.txt
그리고 -cwd 옵션을 써서 p628-kvm1 서버의 /tmp/data1/ 디렉토리에서 모든 파일을 execution host로 가져갑니다. 아직 어느 서버가 execution host가 될지는 모릅니다.
[cecuser@p628-kvm1 ~]$ bsub -I -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste.sh
Job <493> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>
donut biscuit bagel
위와 같이 p628-kvm3에서 수행이 된 것을 보실 수 있습니다. 실제로 p628-kvm3 서버의 /nvme 디렉토리를 살펴보면 해당 file들이 복사된 것을 보실 수 있습니다.
[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 12
-rw-r--r--. 1 cecuser cecuser 6 Apr 6 02:33 1.txt
-rw-r--r--. 1 cecuser cecuser 8 Apr 6 02:33 2.txt
-rw-r--r--. 1 cecuser cecuser 6 Apr 6 02:33 3.txt
그리고 이렇게 한번 staging area로 cache된 파일은 기본적으로 24시간 남아 있기 때문에 다시 부를 경우 stage in 하지 않고 곧장 다시 사용이 가능합니다.
[cecuser@p628-kvm1 ~]$ bdata cache p628-kvm1:/tmp/data1/*
--------------------------------------------------------------------------------
INPUT:
p628-kvm1:/tmp/data1/*
HASH STATUS REF_JOB XFER_JOB GRACE
e9e6f1* TRANSFERRED - 484@myCluster 23hr29min
이제 paste.sh를 약간 수정해서 paste_back.sh을 만들어 보겠습니다. 여기서는 결과물을 파일로 저장해서 -dst 옵션을 통해 특정 위치로 stage out 시키는 것까지 합니다. 여기서는 원래 data source가 있던 p628-kvm1 서버의 /tmp/data1에 보내도록 하겠습니다.
[cecuser@p628-kvm1 ~]$ cat paste_back.sh
bstage in -src p628-kvm1:/tmp/data1/*
cd data1
paste 1.txt 2.txt 3.txt > result.txt
bstage out -src result.txt -dst p628-kvm1:/tmp/data1/result.txt
수행해보면 다음과 같습니다.
[cecuser@p628-kvm1 ~]$ bsub -I -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste_back.sh
Job <495> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>
이제 -dst로 지정한 위치를 살펴보면 정말 result.txt 파일이 들어와 있습니다.
[cecuser@p628-kvm1 ~]$ ls -l /tmp/data1/
total 16
-rw-rw-r--. 1 cecuser cecuser 6 Apr 6 02:08 1.txt
-rw-rw-r--. 1 cecuser cecuser 8 Apr 6 02:08 2.txt
-rw-rw-r--. 1 cecuser cecuser 6 Apr 6 02:09 3.txt
-rw-rw-r--. 1 cecuser cecuser 20 Apr 6 03:33 result.txt
물론 p628-kvm3 서버의 /nvme에도 해당 파일들이 있는데, 여기서 한번 사용되었던 1~3.txt 파일들은 data가 변경되지 않고 그대로인 것을 눈여겨 보시기 바랍니다. 즉, 기존의 파일 그대로이기 때문에 새로 copy하지 않고 재활용하여 I/O 시간을 줄인 것입니다.
[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 16
-rw-r--r--. 1 cecuser cecuser 6 Apr 6 02:33 1.txt
-rw-r--r--. 1 cecuser cecuser 8 Apr 6 02:33 2.txt
-rw-r--r--. 1 cecuser cecuser 6 Apr 6 02:33 3.txt
-rw-rw-r--. 1 cecuser cecuser 20 Apr 6 03:33 result.txt
만약 이 파일 중 하나의 내용만 살짝 바꾸면 어떻게 될까요 ?
[cecuser@p628-kvm1 ~]$ echo "baguette" > /tmp/data1/1.txt
이제 다시 해보겠습니다. 이번에도 p628-kvm3에서 수행되도록 이번에는 아예 -m 옵션을 쓰겠습니다.
[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm3 -cwd /nvme -data "p628-kvm1:/tmp/data1/*" < paste_back.sh
Job <504> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm3.cecc.ihost.com>>
[cecuser@p628-kvm1 ~]$ cat /tmp/data1/result.txt
baguette biscuit bagel
예, 바뀌어 있습니다. p628-kvm3 서버에 가서 보면 1.txt 뿐만 아니라 2.txt와 3.txt까지 파일 3개가 모두 시간이 바뀐 것을 보실 수 있습니다.
[cecuser@p628-kvm3 ~]$ ls -l /nvme/data1/
total 16
-rw-r--r--. 1 cecuser cecuser 9 Apr 6 03:41 1.txt
-rw-r--r--. 1 cecuser cecuser 8 Apr 6 03:41 2.txt
-rw-r--r--. 1 cecuser cecuser 6 Apr 6 03:41 3.txt
-rw-r--r--. 1 cecuser cecuser 23 Apr 6 03:41 result.txt
[cecuser@p628-kvm3 ~]$ cat /nvme/data1/result.txt
baguette biscuit bagel
위에서 수행된 job id 504는 물론 bhist 명령으로 좀 더 자세히 볼 수 있습니다. 그런데, 이렇게 data stage in/out 명령이 수반되는 job은 사실 하나의 job id가 추가로 생성됩니다. 즉, 504 외에 자동으로 505라는 job id도 생성되는데, 이건 우리가 사용한 interactive queue가 아니라 dataq 라는 LSF Data Manager에서만 사용하는 특수 queue로 갑니다.
[cecuser@p628-kvm1 ~]$ bhist -l 504
Job <504>, User <cecuser>, Project <default>, Interactive mode, Command <bstage
in -src p628-kvm1:/tmp/data1/*;cd data1;paste 1.txt 2.txt
3.txt > result.txt;bstage out -src result.txt -dst p628-k
vm1:/tmp/data1/result.txt>
Mon Apr 6 03:41:35: Submitted from host <p628-kvm1>, to Queue <interactive>, C
WD <$HOME>, Specified CWD </nvme>, Specified Hosts <p628-k
vm3>, Data Requirement Requested;
Mon Apr 6 03:41:49: Dispatched 1 Task(s) on Host(s) <p628-kvm3.cecc.ihost.com>
, Allocated 1 Slot(s) on Host(s) <p628-kvm3.cecc.ihost.com
>, Effective RES_REQ <select[type == any] order[r15s:pg] >
;
Mon Apr 6 03:41:49: Starting (Pid 1611);
Mon Apr 6 03:41:55: Done successfully. The CPU time used is 0.1 seconds;
Mon Apr 6 03:41:56: Post job process done successfully;
MEMORY USAGE:
MAX MEM: 3 Mbytes; AVG MEM: 3 Mbytes
Summary of time in seconds spent in various states by Mon Apr 6 03:41:56
PEND PSUSP RUN USUSP SSUSP UNKWN TOTAL
14 0 6 0 0 0 20
[cecuser@p628-kvm1 ~]$ bhist -l 505
Job <505>, User <cecuser>, Project <default>, Command </opt/ibm/lsfsuite/lsf/10
.1/linux3.10-glibc2.17-ppc64le/etc/dm_stagein_transfer.sh>
, Job Description <4#user#7#cecuser#9#p628-kvm1#12#/tmp/da
ta1/*#32#3e53101b571911387ba9e9f222243bf9#>
Mon Apr 6 03:41:41: Submitted from host <p628-kvm1>, to Queue <dataq>, CWD <$H
OME>, Specified CWD </home/staging/stgin/user/cecuser/p628
-kvm1/tmp/data1/*/3e53101b571911387ba9e9f222243bf9>, Outpu
t File </dev/null>, Specified Clusters <myCluster>;
Mon Apr 6 03:41:41: Dispatched 1 Task(s) on Host(s) <p628-kvm1>, Allocated 1 S
lot(s) on Host(s) <p628-kvm1>, Effective RES_REQ <select[t
ype == local] order[r15s:pg] >;
Mon Apr 6 03:41:41: Starting (Pid 26673);
Mon Apr 6 03:41:41: Running with execution home </home/cecuser>, Execution CWD
</home/staging/stgin/user/cecuser/p628-kvm1/tmp/data1/*/3
e53101b571911387ba9e9f222243bf9>, Execution Pid <26673>;
Mon Apr 6 03:41:44: Done successfully. The CPU time used is 0.3 seconds;
Mon Apr 6 03:41:44: Post job process done successfully;
MEMORY USAGE:
MAX MEM: 10 Mbytes; AVG MEM: 6 Mbytes
Summary of time in seconds spent in various states by Mon Apr 6 03:41:44
PEND PSUSP RUN USUSP SSUSP UNKWN TOTAL
0 0 3 0 0 0 3
여기서 사용된 dataq는 lsfadmin 유저만 사용할 수 있는 특수 queue로서, 일반 사용자는 여기에 job을 submit할 수 없습니다.
[cecuser@p628-kvm1 ~]$ bqueues
QUEUE_NAME PRIO STATUS MAX JL/U JL/P JL/H NJOBS PEND RUN SUSP
admin 50 Open:Active - - - - 0 0 0 0
owners 43 Open:Active - - - - 0 0 0 0
priority 43 Open:Active - - - - 0 0 0 0
night 40 Open:Active - - - - 0 0 0 0
short 35 Open:Active - - - - 0 0 0 0
dataq 33 Open:Active - - - - 0 0 0 0
normal 30 Open:Active - - - - 0 0 0 0
interactive 30 Open:Active - - - - 0 0 0 0
idle 20 Open:Active - - - - 0 0 0 0
이 dataq에 사용되는 host는 lsb.queues 파일에 HOSTS로 등록된 서버, 즉 STAGE AREA에 read/write를 주관하는 서버 뿐입니다.
[cecuser@p628-kvm1 ~]$ bqueues -l dataq
QUEUE: dataq
-- No description provided.
PARAMETERS/STATISTICS
PRIO NICE STATUS MAX JL/U JL/P JL/H NJOBS PEND RUN SSUSP USUSP RSV PJOBS
33 0 Open:Active - - - - 0 0 0 0 0 0 0
Interval for a host to accept two jobs is 0 seconds
SCHEDULING PARAMETERS
r15s r1m r15m ut pg io ls it tmp swp mem
loadSched - - - - - - - - - - -
loadStop - - - - - - - - - - -
USERS: all
HOSTS: p628-kvm1
DATA_TRANSFER: Y
==============================
위에서는 STAGING_AREA를 NFS나 GPFS(Spectrum Scale) 같은 shared filesystem을 썼습니다만, 경우에 따라서는 병렬 파일시스템이 없는 경우도 있습니다. 그런 경우에도 LSF DM을 쓸 수 있는데, 그런 경우에는 STAGING_AREA를 다음과 같이 설정하면 됩니다.
[cecuser@p628-kvm1 ~]$ grep STAGING $EGO_TOP/conf/lsf.datamanager.myCluster
# STAGING_AREA = [host_name:]abs_file_path
STAGING_AREA = p628-kvm1:/opt/ibm/lsfsuite/lsf/work/myCluster/staging
즉, STAGING_AREA로 지정된 directory 앞에 DM master의 hostname을 붙이면 됩니다. 큰 cluster에서는 DM master 외에도 I/O를 담당하는 I/O node들이 있을 수 있는데, 그런 경우에는 STAGING_AREA는 반드시 (execution host들은 아니더라도) DM master와 I/O node들 간에는 NFS나 GPFS와 같은 공유 파일시스템을 이용해서 마운트해야 합니다.
또한, 위와 같이 non-shared STAGING_AREA를 사용하는 경우엔 execution host들, 즉 slave들이 DM master로부터 scp를 이용해서 파일을 copy 해가므로, 해당 user에서 'no-password-access'가 가능하도록 미리 구성을 해놓아야 합니다.
[cecuser@p628-kvm1 ~]$ bdata showconf | grep STAGING
STAGING_AREA = p628-kvm1:/opt/ibm/lsfsuite/lsf/work/myCluster/staging
[cecuser@p628-kvm1 ~]$ cat job1.sh
bstage in -src p628-kvm1:/tmp/test1.txt
cat test1.txt
[cecuser@p628-kvm1 ~]$ bsub -I -m p628-kvm2 -data "p628-kvm1:/tmp/test1.txt" < job1.sh
Job <585> is submitted to default queue <interactive>.
<<Waiting for dispatch ...>>
<<Starting on p628-kvm2.cecc.ihost.com>>
beef jerky
[cecuser@p628-kvm2 ~]$ ls -ltr
total 4
-rw-r--r--. 1 cecuser cecuser 11 Apr 9 00:44 test1.txt
댓글 없음:
댓글 쓰기