OS提供のパッケージをインストールしてもいいのだが、ソースコードからrpmbuildで作成したパッケージを採用してます
slurm/rpmbuildで作ったパッケージをインストールします
[root@slurm ~]# cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)
[root@slurm ~]# dnf localinstall rpmbuild/RPMS/x86_64/slurm-24.05.4-1.el9.x86_64.rpm \
rpmbuild/RPMS/x86_64/slurm-slurmctld-24.05.4-1.el9.x86_64.rpm
[root@slurm ~]#
*パッケージ版だとあるのにソースコードからrpmbuildで作ると含まれていないファイルがあるのでそれらの対処を行う
ディストリビューターがシステム全体の観点から用意頂いたものかな
[root@slurm ~]# groupadd -g 5000 slurm; useradd -M -d /var/lib/slurm -s /sbin/nologin -u 5000 -g slurm slurm
[root@slurm ~]# echo "D /run/slurm 0755 slurm slurm -" > /usr/lib/tmpfiles.d/slurm.conf
[root@slurm ~]# /usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/slurm.conf
[root@slurm ~]# vi /etc/logrotate.d/slurm
/var/log/slurm/*.log {
missingok
notifempty
copytruncate
rotate 5
}
[root@slurm ~]# mkdir -p /var/spool/slurm/ctld /var/log/slurm /opt/slurm/etc
[root@slurm ~]# chown -R slurm. /var/spool/slurm /var/log/slurm /opt/slurm/etc
(slurmのpath設定)
[root@slurm slurm]# vi /etc/profile.d/slurm.sh
if [ -d /opt/slurm/bin ]; then
export PATH=${PATH}:/opt/slurm/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/slurm/lib64
fi
[root@slurm slurm]# vi /etc/profile.d/slurm.csh
if ( -d /opt/slurm/bin ) then
setenv PATH ${PATH}:"/opt/slurm/bin"
setemv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:"/opt/slurm/lib64"
endif
[root@slurm slurm]#
*基本logはsyslogに回るようでファイルに落とす必要がないなら logrotate は不要かな.
管理ノードと計算ノードの認証にこれまでは外部パッケージの munge を使っていましたが、slurm内のプラグインで代用できるみたい
っでその設定
[root@slurm ~]# dd if=/dev/random of=/opt/slurm/etc/slurm.key bs=1024 count=1
[root@slurm ~]# chown slurm. /opt/slurm/etc/slurm.key
[root@slurm ~]# chmod 0600 /opt/slurm/etc/slurm.key
この「slurm.key」は各計算ノードの「/opt/slurm/etc/slurm.key」にコピーします. munge.keyと同じような感じです
設定ファイルは「/opt/slurm/etc」に置きます.
ファイル名は「/opt/slurm/etc/slurm.conf」として. SRPMにある設定ファイルを転用して下記にようにしました
[root@slurm ~]# vi /opt/slurm/etc/slurm.conf
ClusterName=cluster
SlurmctldHost=slurm
#AuthType=auth/munge
AuthType=auth/slurm
CredType=auth/slurm
MpiDefault=none
GresTypes=gpu
ProctrackType=proctrack/cgroup
ReturnToService=2
SlurmctldPidFile=/run/slurm/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/run/slurm/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurm/d
SlurmUser=slurm
SlurmdUser=root <--- rootでないとcgroup情報が取れないみたい
SrunPortRange=60001-63000
StateSaveLocation=/var/spool/slurm/ctld
SwitchType=switch/none
TaskPlugin=task/cgroup
# TIMERS
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
# JOB PRIORITY
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
AccountingStoreFlags=YES
JobCompType=jobcomp/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/cgroup
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
# COMPUTE NODES
NodeName=n1 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=16001 Gres=gpu:1
NodeName=n2 CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=15732 Gres=gpu:1
NodeName=n3 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=16000
PartitionName=workq Nodes=ALL Default=YES MaxTime=INFINITE State=UP
[root@slurm ~]#
調整の例:slurm/slurm.conf
留意 このslurm.confファイルで計算ノードとqueueの定義を行います.
あとcgroup.confとgres.confを用意します
[root@slurm ~]# vi /opt/slurm/etc/cgroup.conf
CgroupMountpoint="/sys/fs/cgroup"
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
[root@slurm ~]# vi /opt/slurm/etc/gres.conf
AutoDetect=nvml
[root@slurm ~]#
ファイアウォールの設定セットとなるものは用意されていないみたい
大抵は「/usr/lib/firewalld/services/」に置かれるのだが...
恐らく設定ファイルで変更できるから初めから入れていないのかも
ここでは 6817-6818/TCP と srun 向けに 60001-63000/TCP を開けておく
[root@slurm ~]# firewall-cmd --add-port=6817-6818/tcp --add-port=60001-63000/tcp --zone=public --permanent
[root@slurm ~]# firewall-cmd --reload
*管理ノードで「srun」を発行するならfirewalldに追加で「SrunPortRange」で定義したtcpを開ける. 管理ノードのみ. 計算ノードに適用不要です
[root@slurm ~]# systemctl enable slurmctld --now
ここでは「slurm.conf」の「SlurmUser」が示すようにユーザ「slurm」が slurmctld を動かしてます.
StateSaveLocationの場所(「/var/spool/slurm/ctld」)に各種のstateファイルが置かれます。
この段階で、sinfoとかで確認が出来る 各ノードの調整がまだなので「slurm.conf」の値だけで掲示してます
[illya@slurm-client ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
workq* up infinite 3 unk n[1-3]
[illya@slurm-client ~]$ sinfo -N -l
Mon Dec 26 02:27:40 2022
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
n1 1 workq* unknown* 1 1:1:1 16001 0 1 (null) none
n2 1 workq* unknown* 2 1:2:1 15732 0 1 (null) none
n3 1 workq* unknown* 4 1:4:1 16000 0 1 (null) none
[illya@slurm-client ~]$
上手く動かない時は直接デーモンを起動させる
「/opt/slurm/sbin/slurmctld -D」
これでインターラクティヴで動作が見えます
管理ノードで修正したslurm.confやcgroup.confを自動で計算ノードに配布してくれる機能
https://slurm.schedmd.com/configless_slurm.html
DNSのSRVを使えば計算ノードもジョブ発行ノードもほぼほぼ手を付けずに設定ファイルがいきわたる様子.
素晴らしい.
設定方法は
管理ノードのslurm.confに
SlurmctldParameters=enable_configless
を加えてslurmctldを再起動させる
あと計算ノード、ジョブ発行ノードを調整しますが、簡単にはDNSのSRVを調整します. ここではdnsmasqを使っていて
その設定ファイル「/etc/dnsmasq.conf」に下記を追加します
# for slurmd
srv-host=_slurmctld._tcp.sybyl.local,slurm.sybyl.local,6817
*BINDならゾーンファイルに「_slurmctld._tcp 3600 IN SRV 10 0 6817 slurm」を追記します
「sybyl.local」はここのドメイン名です.
これでdnsmasqを再起動すれば、slurmdを起動したときにdnsmasqに問い合わせ参照先を得て、slurmの設定ファイルを取得します
nslookup で確認してみます
[root@slurm ~]# nslookup -type=SRV _slurmctld._tcp.sybyl.local
Server: 192.168.0.3
Address: 192.168.0.3#53
_slurmctld._tcp.sybyl.local service = 0 0 6817 slurm.sybyl.local.
[root@slurm ~]#
伝播されたファイルは「/var/spool/slurm/d」に置かれます
root@n1:~# ls -l /var/spool/slurm/d
total 16
drwxr-xr-x 2 root root 4096 12月 27 06:24 conf-cache
-rw------- 1 root root 8 12月 27 06:24 cred_state
-rw------- 1 root root 8 12月 27 06:17 cred_state.old
-rw-r--r-- 1 root root 3230 12月 27 06:24 hwloc_topo_whole.xml
root@n1:~#
root@n1:~# ls -l /var/spool/slurm/d/conf-cache/
total 12
-rw-r--r-- 1 root root 227 12月 27 06:24 cgroup.conf
-rw-r--r-- 1 root root 140 12月 27 06:24 gres.conf
-rw-r--r-- 1 root root 1664 12月 27 06:24 slurm.conf
root@n1:~#
となる.
管理ノードでこれら設定ファイル「cgroup, gres, slurm」を修正して「scontrol reconfig」を実行すると
計算ノードのこれらのファイルが更新されます
ネットワーク管理者に「すみません。このSRVコードを仕込んでくれませんか?」っていうのは容易いが実現できるかは微妙..
っで自分でdnsサーバを立ち上げてしまうのもありかなと.
っでDNSの問い合わせをnmtuiで自分自身にさせて、dnsmasqを入れて /etc/dnsmasq.conf で定義. より上位の問い合わせは同じネットワーク内になるのでdomain-neededを無効にして
上位の参照先を「/etc/dnsmasq_resolv.conf」に記載しておく.
[root@slurm ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.69 slurm
192.168.0.14 n1
192.168.0.15 n2
192.168.0.16 n3
192.168.0.7 s
192.168.0.20 slurm-client
192.168.0.166 slurmdbd
[root@slurm ~]# dnf install dnsmasq dnsutils -y
[root@slurm ~]# cat /etc/resolv.conf <-- nmtuiでの変更を確認
# Generated by NetworkManager
nameserver 127.0.0.1
[root@slurm ~]# vi /etc/dnsmasq.conf
port=53
#domain-needed
bogus-priv
interface=eth1 <-- サービス対象のネットワークに接続しているnicを指定
resolv-file=/etc/dnsmasq_resolv.conf
srv-host=_slurmctld._tcp,slurm,6817
[root@slurm ~]# vi /etc/dnsmasq_resolv.conf
nameserver 192.168.0.3
[root@slurm ~]# systemctl enable dnsmasq.service --now
(確認)
[root@slurm ~]# nslookup -type=SRV _slurmctld._tcp
Server: 127.0.0.1
Address: 127.0.0.1#53
_slurmctld._tcp service = 0 0 6817 slurm.
[root@slurm ~]#
[root@slurm ~]# nslookup slurm
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: slurm
Address: 192.168.0.69
[root@slurm ~]#
ここではmungeは使わないのだが、ソースコードはmungeを使うように「slurmctld.service」が用意されている。
また、この管理ノードで configless のための dnsmasq を動かしている。その事を考慮して「slurmctld.service」を修正する
[root@slurm ~]# vi /usr/lib/systemd/system/slurmctld.service
After=network-online.target remote-fs.target munge.service sssd.service
↓
After=network-online.target remote-fs.target sssd.service dnsmasq.service
[root@slurm ~]#
[root@slurm ~]# systemctl daemon-reload
domain(sybyl.localら)を持つ場合、search domainにもそのdomainを入れること. DNSへのSRVレコードはFQDNで行う事
samba adでの登録なら
samba-tool dns add ad sybyl.local _slurmctld._tcp.sybyl.local SRV "slurm.sybyl.local 6817 0 0"
とする