この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Schedmd-Slurm-GCPのHPCクラスター環境を構築しました。各ノード間で共有されているディレクトリを確認する機会がありましたのでまとめます。
確認結果
コントローラーノードから各ノードへ特定ディレクトリが共有されている。
検証環境
Schedmd-Slurm-GCP
項目 | 値 |
---|---|
バージョン | 4.0.0 |
オペレーティング システム | CentOS 7 |
パッケージの内容 | Slurm 20.11.4 |
構築方法
各ノードのNFS共有・マウント状況
HPCクラスター間でデータや、設定ファイルを共有する必要があります。ログインノード、コントローラーノード、コンピューノードの合計3ノードを個別に状況を確認します。
ログインノード
コントローラーノードから4個のディレクトリがマウントされていました。
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 30G 11G 20G 36% /
tmpfs 3.9G 52K 3.9G 1% /tmp
/dev/sda1 200M 12M 189M 6% /boot/efi
blog-sample-cluster-controller:/usr/local/etc/slurm 30G 11G 20G 36% /usr/local/etc/slurm
blog-sample-cluster-controller:/etc/munge 30G 11G 20G 36% /etc/munge
blog-sample-cluster-controller:/home 30G 11G 20G 36% /home
blog-sample-cluster-controller:/apps 30G 11G 20G 36% /apps
tmpfs 783M 0 783M 0% /run/user/0
tmpfs 783M 0 783M 0% /run/user/1347777605
コントローラーノード
NFS共有状況を確認します。ログインノードにマウントされていたディレクトリがエクスポートされています。
$ showmount -e
Export list for blog-sample-cluster-controller:
/apps *
/home *
/etc/munge *
/usr/local/etc/slurm *
コントローラーノードの/dev/sda2
のディスクサイズには気をつけた方が良さそうです。HPCクラスター構築時のデフォルトサイズが30GBだったので、デフォルトのままHPCクラスターをデプロイしています。
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 30G 11G 20G 36% /
tmpfs 3.9G 56K 3.9G 1% /tmp
/dev/sda1 200M 12M 189M 6% /boot/efi
tmpfs 783M 0 783M 0% /run/user/0
tmpfs 783M 0 783M 0% /run/user/1347777605
コンピューノード
テストジョブを投げてコンピューノードを起動させ確認しました。ログインノードと同様にコンピューノードのディレクトリがマウントされています。
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 30G 11G 20G 36% /
tmpfs 3.9G 52K 3.9G 1% /tmp
/dev/sda1 200M 12M 189M 6% /boot/efi
blog-sample-cluster-controller:/usr/local/etc/slurm 30G 11G 20G 36% /usr/local/etc/slurm
blog-sample-cluster-controller:/apps 30G 11G 20G 36% /apps
blog-sample-cluster-controller:/home 30G 11G 20G 36% /home
blog-sample-cluster-controller:/etc/munge 30G 11G 20G 36% /etc/munge
tmpfs 783M 0 783M 0% /run/user/1347777605
NFS共有ディレクトリの内容を確認
コントローラーノードから共有されているディレクトリには何が保存されているのか?ログインノードから確認してみます。
/home
ログインノードにログインしたユーザのホームディレクトリは、コントローラーノードから共有されたディレクトリがマウントされているパスでした。
$ ll /home
total 0
drwx------ 3 cloud-hpc-image-guitar cloud-hpc-image-guitar 74 Jan 28 08:26 cloud-hpc-image-guitar
drwx------ 3 hongbolu hongbolu 74 Jan 28 08:26 hongbolu
drwx------ 3 jianyang jianyang 74 Jan 28 08:26 jianyang
drwxr-xr-x 2 ohmura_yasutaka_classmethod_jp ohmura_yasutaka_classmethod_jp 171 Jul 10 01:54 ohmura_yasutaka_classme
thod_jp
drwx------ 3 tannerlove tannerlove 74 Jan 28 08:26 tannerlove
/usr/local/etc/slurm
Slurmの設定ファイルが共有されていました。気になるのはデフォルトでslurmdbd.conf
が用意されています。Slurmで利用するデータベースとの接続設定などを記述するファイルです。Slurmではデータベースとの接続は推奨されているもののオプション扱いです。設定内容も確認してみましょう。
$ ll /usr/local/etc/slurm/
total 16
-rw-r--r-- 1 slurm slurm 153 Jul 10 00:59 cgroup.conf
-rw-r--r-- 1 slurm slurm 4485 Jul 10 00:59 slurm.conf
-rw------- 1 slurm slurm 720 Jul 10 00:59 slurmdbd.conf
StorageHost
がlocalhost
を指しています。コントローラーノードにMySQL系のデータベースが存在しているのでしょうか。
slurmdbd.conf
#ArchiveEvents=yes
#ArchiveJobs=yes
#ArchiveResvs=yes
#ArchiveSteps=no
#ArchiveSuspend=no
#ArchiveTXN=no
#ArchiveUsage=no
AuthType=auth/munge
AuthAltTypes=auth/jwt
AuthAltParameters=jwt_key=/var/spool/slurm/jwt_hs256.key
DbdHost=blog-sample-cluster-controller
DebugLevel=debug
#PurgeEventAfter=1month
#PurgeJobAfter=12month
#PurgeResvAfter=1month
#PurgeStepAfter=1month
#PurgeSuspendAfter=1month
#PurgeTXNAfter=12month
#PurgeUsageAfter=24month
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurm/slurmdbd.pid
SlurmUser=slurm
StorageLoc=slurm_acct_db
StorageType=accounting_storage/mysql
StorageHost=localhost
StoragePort=3306
StorageUser=slurm
StoragePass=""
#StorageUser=database_mgr
#StoragePass=shazaam
ログインノードからsacct
コマンドを打ってみました。Slurmのジョブ実行履歴が確認できました。コントローラーノードにデフォルトでSlurmのデータベースを持っておりジョブ実行履歴を記録しているようです。ここの話は長くなるのでまた別の機会に調べます。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
2 test.sh p1 1 FAILED 2:0
2.batch batch 1 FAILED 2:0
3 test.sh p1 1 FAILED 2:0
3.batch batch 1 FAILED 2:0
4 test.sh p1 1 FAILED 2:0
4.batch batch 1 FAILED 2:0
5 test.sh p1 1 COMPLETED 0:0
5.batch batch 1 COMPLETED 0:0
Slurmの設定ファイルも確認します。全文は長いため折りたたみます。
折りたたみ
slurm.conf
# slurm.conf file generated by configurator.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=blog-sample-cluster-controller
#ControlAddr=
#BackupController=
#BackupAddr=
#
AuthType=auth/munge
AuthInfo=cred_expire=120
AuthAltTypes=auth/jwt
#CheckpointType=checkpoint/none
CredType=cred/munge
#DisableRootJobs=NO
#EnforcePartLimits=NO
#Epilog=
#FirstJobId=1
#MaxJobId=999999
#GroupUpdateForce=0
#GroupUpdateTime=600
#JobCheckpointDir=/var/slurm/checkpoint
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
#JobFileAppend=0
#JobRequeue=1
#JobSubmitPlugins=1
#KillOnBadExit=0
#LaunchType=launch/slurm
#Licenses=foo*4,bar
#MailProg=/bin/mail
#MaxJobCount=5000
#MaxStepCount=40000
#MaxTasksPerNode=128
MpiDefault=none
#MpiParams=ports=#-#
#PluginDir=
#PlugStackConfig=
#PrivateData=jobs
LaunchParameters=enable_nss_slurm,use_interactive_step
# Always show cloud nodes. Otherwise cloud nodes are hidden until they are
# resumed. Having them shown can be useful in detecting downed nodes.
# NOTE: slurm won't allocate/resume nodes that are down. So in the case of
# preemptible nodes -- if gcp preempts a node, the node will eventually be put
# into a down date because the node will stop responding to the controller.
# (e.g. SlurmdTimeout).
PrivateData=cloud
ProctrackType=proctrack/cgroup
#Prolog=
#PrologFlags=
#PropagatePrioProcess=0
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=Sched
#RebootProgram=
ReturnToService=2
#SallocDefaultCommand=
SlurmctldPidFile=/var/run/slurm/slurmctld.pid
SlurmctldPort=6820-6830
SlurmdPidFile=/var/run/slurm/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
#SrunEpilog=
#SrunProlog=
StateSaveLocation=/var/spool/slurm
SwitchType=switch/none
#TaskEpilog=
TaskPlugin=task/affinity,task/cgroup
#TaskPluginParam=
#TaskProlog=
#TopologyPlugin=topology/tree
#TmpFS=/tmp
#TrackWCKey=no
#TreeWidth=
#UnkillableStepProgram=
#UsePAM=0
#
#
# TIMERS
#BatchStartTimeout=10
#CompleteWait=0
#EpilogMsgTime=2000
#GetEnvTimeout=2
#HealthCheckInterval=0
#HealthCheckProgram=
InactiveLimit=0
KillWait=30
MessageTimeout=60
#ResvOverRun=0
MinJobAge=300
#OverTimeLimit=0
SlurmctldTimeout=120
SlurmdTimeout=300
#UnkillableStepTimeout=60
#VSizeFactor=0
Waittime=0
#
#
# SCHEDULING
#MaxMemPerCPU=0
#SchedulerTimeSlice=30
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
#
#
# JOB PRIORITY
#PriorityFlags=
#PriorityType=priority/basic
#PriorityDecayHalfLife=
#PriorityCalcPeriod=
#PriorityFavorSmall=
#PriorityMaxAge=
#PriorityUsageResetPeriod=
#PriorityWeightAge=
#PriorityWeightFairshare=
#PriorityWeightJobSize=
#PriorityWeightPartition=
#PriorityWeightQOS=
#
#
# LOGGING AND ACCOUNTING
#AccountingStorageEnforce=associations,limits,qos,safe
AccountingStorageHost=blog-sample-cluster-controller
#AccountingStorageLoc=
#AccountingStoragePass=
#AccountingStoragePort=
AccountingStorageType=accounting_storage/slurmdbd
#AccountingStorageUser=
AccountingStoreJobComment=YES
ClusterName=blog-sample-cluster
#DebugFlags=powersave
#JobCompHost=
#JobCompLoc=
#JobCompPass=
#JobCompPort=
JobCompType=jobcomp/none
#JobCompUser=
#JobContainerType=job_container/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd-%n.log
#
#
# Use Prolog/EpilogSlurmctld to make job to node one-to-one.
# enable_placement=true with c2-standards creates placement groups
# enable_placement=true w/out c2-standards creates one-to-one mappings of nodes.
# must set OverSubscribe=Exclusive on the corresponding partitions.
PrologSlurmctld=/slurm/scripts/resume.py
EpilogSlurmctld=/slurm/scripts/suspend.py
# POWER SAVE SUPPORT FOR IDLE NODES (optional)
SuspendProgram=/slurm/scripts/suspend.py
ResumeProgram=/slurm/scripts/resume.py
ResumeFailProgram=/slurm/scripts/suspend.py
SuspendTimeout=300
ResumeTimeout=300
ResumeRate=0
#SuspendExcNodes=
#SuspendExcParts=
SuspendRate=0
SuspendTime=300
#
SchedulerParameters=salloc_wait_nodes
SlurmctldParameters=cloud_dns,idle_on_node_suspend
CommunicationParameters=NoAddrCache
GresTypes=gpu
#
# COMPUTE NODES
NodeName=DEFAULT CPUs=1 RealMemory=7552 State=UNKNOWN
NodeName=blog-sample-cluster-compute-0-[0-9] State=CLOUD
PartitionName=p1 Nodes=blog-sample-cluster-compute-0-[0-9] MaxTime=INFINITE State=UP DefMemPerCPU=7552 LLN=yes Default=YES
/app
OpemMPIのディレクトリが共有されていました。
$ ll /apps
total 0
drwxr-xr-x 3 root root 21 Mar 12 22:18 modulefiles
drwxr-xr-x 3 root root 35 Mar 12 22:18 ompi
$ tree -L 2 /apps
/apps
├── modulefiles
│ └── openmpi
└── ompi
├── openmpi -> /apps/ompi/v4.1.x
└── v4.1.x
/etc/munge
MUNGEはHPCクラスター環境で利用される資格情報を作成、検証を行う認証サービスです。コンピューノードとの認証用の鍵をコントローラーノードで共有しています。
$ sudo ls -l /etc/munge/
total 4
-r-------- 1 munge munge 1024 Jul 10 00:59 munge.key
- MUNGE by dun
- dun/munge: MUNGE (MUNGE Uid 'N' Gid Emporium) is an authentication service for creating and validating user credentials.
おわりに
NFS共有されているディレクトリは忘れたころに何が共有されているんだっけ?と調べ直しがよくあったのでまとめました。 当初はSlurmの設定ファイルを確認したくてNFS共有されているディレクトリを捜索していたのですが、Slurm用のデータベースをデフォルトで構築されるとは予想していませんでした。HPCクラスター単体でみると最初から用意されていて嬉しいですね。