# Slurm 安裝流程 # Slurm 在 HPC 叢集中的角色 * User **Login** Node: HPC 叢集的登入點,使用者進行操作的主機。 * Slurm **Control** Node: Slurm 控制主機,負責工作排程、指派。 * Slurm **Compute** Node: Slurm 運算主機,接受 Slurm 控制主機指派的工作。 * Slurm **Database** Node: Slurm 資料庫主機,負責紀錄工作歷史、資源用量等資訊。資料庫服務通常會由建置在同一臺主機上的 MariaDB 或 MySQL 提供。 本安裝流程的每個步驟皆有標示該步驟適用的角色。例如: 標示「**All** Nodes」的步驟必須在所有主機上完成;而標示「User **Login** Node」的步驟只要在 HPC 叢集的登入點主機上完成即可。依此類推。 # 安裝環境 * 作業系統: * CentOS,版本 7.9.2009。 * 關閉 SELinux。 * 防火牆允許源自 HPC 叢集所在網段的所有連線。 * 安裝所有可用更新。 * 本安裝流程以及提供的範例設定檔假設有 4 臺主機,主機名稱 (Host name) 及其對應的 Slurm 角色為: * `login`: User **Login** Node * `slurm-control`: Slurm **Control** Node、Slurm **Database** Node * `slurm-compute01`: Slurm **Compute** Node * `slurm-compute02`: Slurm **Compute** Node * 所有主機的 `/etc/hosts` 都必須包含完整、正確的主機名稱與對應 IP 位址,例如: 172.100.0.10 login 172.100.0.20 slurm-control 172.100.0.30 slurm-compute01 172.100.0.31 slurm-compute02 # 1. 新增 `epel-release`、`mariadb` 套件庫 (角色: **All** Nodes) cat >/etc/yum.repos.d/MariaDB.repo <<EOF [mariadb] name=MariaDB baseurl=https://ftp.ubuntu-tw.org/mirror/mariadb/yum/10.5/centos7-amd64 gpgkey=https://ftp.ubuntu-tw.org/mirror/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF yum makecache yum install -y epel-release yum makecache # 2. 新增必要的使用者和群組 (角色: **All** Nodes) groupadd -g 901 munge useradd -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -g munge -m -s /sbin/nologin -u 901 munge groupadd -g 902 slurm useradd -c "Slurm Workload Manager" -d /var/lib/slurm -g slurm -m -s /bin/bash -u 902 slurm # 3. 安裝套件 ## 3.1. 安裝 `munge`、`slurm`、`slurm-contribs`、`slurm-perlapi` 套件 (角色: **All** Nodes) yum install -y munge slurm slurm-contribs slurm-perlapi ## 3.2. 安裝 `slurm-devel`、`slurm-pmi`、`slurm-pmi-devel` 套件 (角色: User **Login** Node) yum install -y slurm-devel slurm-pmi slurm-pmi-devel ## 3.3. 安裝 `slurm-slurmctld` 套件 (角色: Slurm **Control** Node) yum install -y slurm-slurmctld ## 3.4. 安裝 `slurm-slurmd`、`slurm-pmi` 套件 (角色: Slurm **Compute** Node) yum install -y slurm-slurmd slurm-pmi ## 3.5. 安裝 `MariaDB-server`、`MariaDB-client`、`slurm-slurmdbd` 套件 (角色: Slurm **Database** Node) yum install -y MariaDB-server MariaDB-client slurm-slurmdbd # 4. 產生、複製 `munge.key` 金鑰 (角色: **All** Nodes) 在任意一臺主機上執行以下指令,即可產生 `/etc/munge/munge.key` 金鑰檔案。 create-munge-key 然後,將此檔案複製到 HPC 叢集中,所有主機上的相同位置。最後,基於安全因素,應確認以下檔案之權限、擁有者。 chmod 400 /etc/munge/munge.key chown munge:munge /etc/munge/munge.key # 5. 確認目錄權限、擁有者 (角色: **All** Nodes) find /var/log/munge /etc/munge -type d -execdir chmod 700 '{}' ';' find /var/run/munge -type d -execdir chmod 755 '{}' ';' find /var/log/slurm /var/spool/slurm -type d -execdir chmod 700 '{}' ';' find /var/run/slurm /etc/slurm -type d -execdir chmod 755 '{}' ';' chown -R munge:munge /var/log/munge /var/run/munge /etc/munge chown -R slurm:slurm /var/log/slurm /var/run/slurm /etc/slurm /var/spool/slurm # 6. 編寫、複製設定檔 ## 6.1. 修改 `cgroup.conf`、`slurm.conf` 範例設定檔 (角色: **All** Nodes) 依需求修改 `cgroup.conf`、`slurm.conf` 範例設定檔的內容,並複製到 `/etc/slurm` 路徑。基本上可以直接用我寫的設定,不過 `slurm.conf` 裡的以下內容會需要因地制宜: * 註解標示 `Control Nodes` 的區塊 需填寫具有 Slurm **Control** Node 角色的主機名稱。 * 註解標示 `Compute Nodes` 的區塊 需填寫具有 Slurm **Compute** Node 角色的主機名稱、硬體相關規格。 * 註解標示 `Partitions` 的區塊 需填寫具有 Slurm **Compute** Node 角色的主機名稱、工作分區相關資訊。 * `AccountingStorageHost` 項目 需填寫具有 Slurm **Database** Node 角色的主機名稱。 最後,基於安全因素,應確認以下檔案之權限、擁有者。 chmod 644 /etc/slurm/cgroup.conf chmod 644 /etc/slurm/slurm.conf chown slurm:slurm /etc/slurm/cgroup.conf chown slurm:slurm /etc/slurm/slurm.conf ## 6.2. 修改 `slurmdbd.conf` 範例設定檔 (角色: Slurm **Database** Node) 依需求修改 `slurmdbd.conf` 範例設定檔的內容,並複製到 `/etc/slurm` 路徑。基本上可以直接用我寫的設定。最後,基於安全因素,應確認以下檔案之權限、擁有者。 chmod 600 /etc/slurm/slurmdbd.conf chown slurm:slurm /etc/slurm/slurmdbd.conf # 7. 啟動服務 ## 7.1. 啟動 `munge` 服務 (角色: **All** Nodes) systemctl start munge systemctl enable munge ## 7.2. 啟動 `mariadb` 服務 (角色: Slurm **Database** Node) systemctl start mariadb systemctl enable mariadb ## 7.3. 設定 `mariadb` 服務、新增必要的資料庫 (角色: Slurm **Database** Node) mysql_secure_installation 2>/dev/null <<EOF n n y y y y EOF mysql -e "create database slurm_acct_db;" mysql -e "create user 'slurm'@'localhost' identified by 'slurmdbd';" mysql -e "grant all privileges on slurm_acct_db.* to 'slurm'@'localhost';" systemctl restart mariadb ## 7.4. 啟動 `slurmdbd` 服務 (角色: Slurm **Database** Node) systemctl start slurmdbd systemctl enable slurmdbd ## 7.5. 啟動 `slurmctld` 服務 (角色: Slurm **Control** Node) systemctl start slurmctld systemctl enable slurmctld ## 7.6. 啟動 `slurmd` 服務 (角色: Slurm **Compute** Node) systemctl start slurmd systemctl enable slurmd # 8. 測試 Slurm 狀態、功能 (角色: User **Login** Node) [root@login ~]# scontrol ping Slurmctld(primary) at slurm-control is UP [root@login ~]# scontrol show node NodeName=slurm-compute01 Arch=x86_64 CoresPerSocket=4 CPUAlloc=0 CPUTot=8 CPULoad=0.08 AvailableFeatures=(null) ActiveFeatures=(null) Gres=(null) NodeAddr=slurm-compute01 NodeHostName=slurm-compute01 Version=20.11.5 OS=Linux 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 RealMemory=1024 AllocMem=0 FreeMem=4096 Sockets=1 Boards=1 State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A Partitions=debug BootTime=2021-05-25T05:24:52 SlurmdStartTime=2021-05-25T08:23:59 CfgTRES=cpu=8,mem=1G,billing=8 AllocTRES= CapWatts=n/a CurrentWatts=0 AveWatts=0 ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s Comment=(null) NodeName=slurm-compute02 Arch=x86_64 CoresPerSocket=4 CPUAlloc=0 CPUTot=8 CPULoad=0.08 AvailableFeatures=(null) ActiveFeatures=(null) Gres=(null) NodeAddr=slurm-compute02 NodeHostName=slurm-compute02 Version=20.11.5 OS=Linux 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 RealMemory=1024 AllocMem=0 FreeMem=4096 Sockets=1 Boards=1 State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A Partitions=debug BootTime=2021-05-25T05:24:52 SlurmdStartTime=2021-05-25T08:24:01 CfgTRES=cpu=8,mem=1G,billing=8 AllocTRES= CapWatts=n/a CurrentWatts=0 AveWatts=0 ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s Comment=(null) [root@login ~]# sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up 1-00:00:00 2 idle slurm-compute[01-02] [root@login ~]# srun --nodes=2 --ntasks-per-node=1 bash -c "echo Hello world from \`hostname\`" Hello world from slurm-compute01 Hello world from slurm-compute02 [root@login ~]# sacct JobID JobName Partition Account AllocCPUS State ExitCode ------------ ---------- ---------- ---------- ---------- ---------- -------- 2 bash debug root 4 COMPLETED 0:0 3 bash debug root 4 COMPLETED 0:0 4 bash debug root 4 COMPLETED 0:0 5 bash debug root 4 COMPLETED 0:0 # 9. 附錄: 範例設定檔 * `cgroup.conf` ``` ### Slurm cgroup.conf Template CgroupAutomount=yes #CgroupMountpoint=/sys/fs/cgroup AllowedRAMSpace=100 AllowedSwapSpace=0 ConstrainCores=yes ConstrainRAMSpace=no ConstrainSwapSpace=no MaxRAMPercent=100 MaxSwapPercent=100 TaskAffinity=no ``` * `slurm.conf` ``` ### Slurm slurm.conf Template ### Control Nodes SlurmctldHost=slurm-control ### Compute Nodes NodeName=slurm-compute[01-02] CPUs=8 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=2 RealMemory=1024 State=UNKNOWN ### Partitions PartitionName=debug Nodes=slurm-compute[01-02] Default=yes MaxCPUsPerNode=8 MaxMemPerNode=1024 MaxTime=24:00:00 State=UP ### Authentication #AuthInfo=/var/run/munge/munge.socket.2 AuthType=auth/munge ### Users SlurmUser=slurm ### Ports SlurmctldPort=6817 SlurmdPort=6818 ### State Preservation ReturnToService=2 SlurmdSpoolDir=/var/spool/slurm/d StateSaveLocation=/var/spool/slurm/ctld ### Scheduling SchedulerType=sched/backfill ### Interconnect SwitchType=switch/none ### Default MPI Type MpiDefault=pmi2 ### Process Tracking ProctrackType=proctrack/cgroup ### Resource Selection SelectType=select/cons_tres SelectTypeParameters=cr_core_memory ### Task Launch TaskPlugin=task/affinity,task/cgroup ### Event Logging SlurmctldDebug=info SlurmctldLogFile=/var/log/slurm/slurmctld.log SlurmdDebug=info SlurmdLogFile=/var/log/slurm/slurmd.log ### Job Accounting Gather JobAcctGatherFrequency=task=30 JobAcctGatherType=jobacct_gather/linux ### Job Accounting Storage AccountingStorageEnforce=safe AccountingStorageHost=slurm-control #AccountingStorageLoc= #AccountingStoragePass= AccountingStoragePort=6819 AccountingStorageType=accounting_storage/slurmdbd #AccountingStorageUser= AccountingStoreJobComment=yes ClusterName=cluster ### Job Completion Logging #JobCompHost= #JobCompLoc= #JobCompPass= #JobCompPort= JobCompType=jobcomp/none #JobCompUser= ### Process ID Logging SlurmctldPidFile=/var/run/slurm/slurmctld.pid SlurmdPidFile=/var/run/slurm/slurmd.pid ### Timers SlurmctldTimeout=120 SlurmdTimeout=300 InactiveLimit=60 KillWait=60 MinJobAge=300 WaitTime=60 #### Miscellaneous KillOnBadExit=1 MailProg=/bin/true RebootProgram=/usr/sbin/reboot ``` * `slurmdbd.conf` ``` ### Slurm slurmdbd.conf Template ### Authentication #AuthInfo=/var/run/munge/munge.socket.2 AuthType=auth/munge ### Slurmdbd DbdHost=localhost DbdPort=6819 DebugLevel=info LogFile=/var/log/slurm/slurmdbd.log PidFile=/var/run/slurm/slurmdbd.pid SlurmUser=slurm ### Archive Database #ArchiveDir=/tmp #ArchiveScript= ArchiveEvents=no ArchiveJobs=no ArchiveResvs=no ArchiveSteps=no ArchiveSuspend=no ArchiveTXN=no ArchiveUsage=no ### Purge Database PurgeEventAfter=1month PurgeJobAfter=1month PurgeResvAfter=1month PurgeStepAfter=1month PurgeSuspendAfter=1month PurgeTXNAfter=1month PurgeUsageAfter=1month ### MariaDB/MySQL StorageHost=localhost StorageLoc=slurm_acct_db StoragePass=slurmdbd StoragePort=3306 StorageType=accounting_storage/mysql StorageUser=slurm ```