#author("2026-08-11T03:30:57+00:00","default:sysosa","sysosa") #author("2026-08-11T03:40:33+00:00","default:sysosa","sysosa") OS提供のパッケージをインストールしてもいいのだが、ソースコードからrpmbuildで作成したパッケージを採用してます [[slurm/rpm]]で作ったパッケージをインストールします #code(nonumber){{ [root@slurm ~]# cat /etc/redhat-release Rocky Linux release 9.7 (Blue Onyx) [root@slurm ~]# dnf localinstall ./rpmbuild/RPMS/x86_64/slurm-25.11.6-1.el9.x86_64.rpm \ ./rpmbuild/RPMS/x86_64/slurm-slurmctld-25.11.6-1.el9.x86_64.rpm [root@slurm ~]# }} &color(red){*};パッケージ版だとあるのにソースコードからrpmbuildで作ると含まれていないファイルがあるのでそれらの対処を行う &size(10){ディストリビューターがシステム全体の観点から用意頂いたものかな}; #code(nonumber){{ [root@slurm ~]# groupadd -g 5000 slurm; useradd -M -d /var/lib/slurm -s /sbin/nologin -u 5000 -g 5000 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 (slurmのpath設定) [root@slurm slurm]# echo -e "export PATH=\${PATH}:/opt/slurm/bin\nexport LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}:/opt/slurm/lib64" > /etc/profile.d/slurm.sh [root@slurm slurm]# echo -e "setenv PATH \${PATH}:/opt/slurm/bin\nsetenv LD_LIBRARY_PATH \${LD_LIBRARY_PATH}:/opt/slurm/lib64" > /etc/profile.d/slurm.csh }} &color(red){*};基本logはsyslogに回るようでファイルに落とす必要がないなら logrotate は不要かな. 管理ノードと計算ノードの認証にこれまでは外部パッケージの munge を使っていましたが、slurm内のプラグインで代用できるみたい っでその設定 #code(nonumber){{ [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」にコピーします. &size(10){munge.keyと同じような感じです}; ***設定ファイル [#f9b15dcc] 設定ファイルは「&color(magenta){/opt/slurm/etc};」に置きます. ファイル名は「/opt/slurm/etc/slurm.conf」として. &size(10){SRPMにある設定ファイルを転用して下記にようにしました}; #code(nonumber){{ [root@slurm ~]# vi /opt/slurm/etc/slurm.conf ClusterName=cluster SlurmctldHost=slurm # FQDNでも構わないが、search domainにdomainが入っていれば[hostname -s]でもok #AuthType=auth/munge AuthType=auth/slurm CredType=cred/slurm MailProg=/bin/true # メール通知を無効にします MpiDefault=none 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情報が取れないみたい 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 <-- core数のみ管理。大きなメモリー消費があるジョブにcoreだけの管理ではOOMが出る可能性がるなら「CR_Core_Memory」に代える SelectTypeParameters=CR_Core # core数のみ管理。大きなメモリー消費があるジョブにcoreだけの管理ではOOMが出る可能性がるなら「CR_Core_Memory」に代える # 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 SlurmdParameters=hostname_short <-- 「hostname -s」で回すなら. GresTypes=gpu 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 Gres=None NodeName=n2 CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=15732 Gres=gpu:1 # RealMemoryはそのノードの搭載メモリー量を超えてると動かない. NodeName=n3 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=16000 Gres=None # RealMemoryはジョブに渡せるサイズを明記. OS分は差っ引く. PartitionName=workq Nodes=ALL Default=YES MaxTime=INFINITE State=UP [root@slurm ~]# }} 調整の例:[[slurm/slurm.conf]] &color(white,blue){留意}; このslurm.confファイルで計算ノードとqueueの定義を行います. あとcgroup.confとgres.confを用意します #code(nonumber){{ [root@slurm ~]# vi /opt/slurm/etc/cgroup.conf CgroupMountpoint="/sys/fs/cgroup" ConstrainCores=yes ConstrainDevices=yes ConstrainRAMSpace=yes # slurm.confのSelectTypeParametersが、CR_Coreなら無効. CR_Core_Memoryなら効きます. ジョブごとにメモリーが定義されます [root@slurm ~]# vi /opt/slurm/etc/gres.conf AutoDetect=nvml [root@slurm ~]# }} ***firewalld [#ua2093ed] ファイアウォールの設定セットとなるものは用意されていないみたい 大抵は「/usr/lib/firewalld/services/」に置かれるのだが... 恐らく設定ファイルで変更できるから初めから入れていないのかも ここでは 6817-6818/TCP と srun 向けに 60001-63000/TCP を開けておく #code(nonumber){{ [root@slurm ~]# firewall-cmd --add-port=6817-6818/tcp --add-port=60001-63000/tcp --zone=public --permanent [root@slurm ~]# firewall-cmd --reload }} &color(red){*};&size(10){管理ノードで「srun」を発行するならfirewalldに追加で「SrunPortRange」で定義したtcpを開ける. 管理ノードのみ. 計算ノードに適用不要です}; ***デーモン起動 [#jfaab186] #code(nonumber){{ [root@slurm ~]# systemctl enable slurmctld --now }} ここでは「slurm.conf」の「SlurmUser」が示すようにユーザ「slurm」が slurmctld を動かしてます. &color(orangered){StateSaveLocation};の場所(「/var/spool/slurm/ctld」)に各種のstateファイルが置かれます。 この段階で、sinfoとかで確認が出来る &size(10){各ノードの調整がまだなので「slurm.conf」の値だけで掲示してます}; #code(nonumber){{ [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 ~]$ }} ***めも [#c7d63f97] 上手く動かない時は直接デーモンを起動させる 「/opt/slurm/sbin/slurmctld -D」 これでインターラクティヴで動作が見えます ***Configless [#d2a5c73c] 管理ノードで修正したslurm.confやcgroup.confを自動で計算ノードに配布してくれる機能 [[https://slurm.schedmd.com/configless_slurm.html>+https://slurm.schedmd.com/configless_slurm.html]] DNSのSRVを使えば計算ノードもジョブ発行ノードもほぼほぼ手を付けずに設定ファイルがいきわたる様子. 素晴らしい. 設定方法は 管理ノードのslurm.confに #code(nonumber){{ SlurmctldParameters=enable_configless }} を加えてslurmctldを再起動させる あと計算ノード、ジョブ発行ノードを調整しますが、簡単にはDNSのSRVを調整します. ここでは[[dnsmasq]]を使っていて その設定ファイル「/etc/dnsmasq.conf」に下記を追加します #code(nonumber){{ # for slurmd srv-host=_slurmctld._tcp.sybyl.local,slurm.sybyl.local,6817 }} &color(red){*};&size(10){BINDならゾーンファイルに「_slurmctld._tcp 3600 IN SRV 10 0 6817 slurm」を追記します}; 「sybyl.local」はここのドメイン名です. これでdnsmasqを再起動すれば、slurmdを起動したときにdnsmasqに問い合わせ参照先を得て、slurmの設定ファイルを取得します nslookup で確認してみます #code(nonumber){{ [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」に置かれます #code(nonumber){{ 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」を実行すると 計算ノードのこれらのファイルが更新されます ***Configless のためにmanagerにdnsmasqを立ててみる [#i20b6e9d] ネットワーク管理者に「すみません。このSRVコードを仕込んでくれませんか?」っていうのは容易いが実現できるかは微妙.. っで自分でdnsサーバを立ち上げてしまうのもありかなと. っでDNSの問い合わせをnmtuiで自分自身にさせて、dnsmasqを入れて /etc/dnsmasq.conf で定義. より上位の問い合わせは同じネットワーク内になるのでdomain-neededを無効にして 上位の参照先を「/etc/dnsmasq_resolv.conf」に記載しておく. #code(nonumber){{ [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 ~]# }} ***slurmctld.service [#y5dce6d4] ここではmungeは使わないのだが、ソースコードはmungeを使うように「slurmctld.service」が用意されている。 また、この管理ノードで configless のための dnsmasq を動かしている。その事を考慮して「slurmctld.service」を修正する #code(nonumber){{ [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 }} ***めも [#u5266284] domain(sybyl.localら)を持つ場合、search domainにもそのdomainを入れること. DNSへのSRVレコードはFQDNで行う事 samba adでの登録なら #code(nonumber){{ samba-tool dns add ad sybyl.local _slurmctld._tcp.sybyl.local SRV "slurm.sybyl.local 6817 0 0" }} freeipaでの登録なら #code(nonumber){{ ipa dnsrecord-add sybyl.local _slurmctld._tcp --srv-rec="0 0 6817 slurm.sybyl.local." }}