一、 Slurm的核心作用
Slurm 是一個開源的、高度可擴展的工作負載調度器,專為高性能計算集羣設計。它的名字是 Simple Linux Utility for Resource Management 的縮寫,但其功能遠不止“簡單”二字。在現代HPC系統中,Slurm扮演着“集羣大腦”或“數字神經中樞”的角色,其主要核心作用包括:
- 資源分配:管理和分配計算節點、CPU核心、內存、GPU等硬件資源給用户提交的計算任務。
- 任務調度:根據預設的策略(如優先級、隊列、資源需求等),決定哪個用户的哪個任務在何時、在哪些節點上運行。
- 作業管理:提供一套完整的命令,允許用户提交、監控、修改、掛起和終止自己的計算任務。
- 工作負載均衡:通過高效的調度算法,確保集羣資源得到充分利用,避免部分節點過載而其他節點閒置,從而提升整個集羣的吞吐量和效率。
二、 Slurm的使用場景及重要性
Slurm 是學術界和工業界構建HPC環境時事實上的標準調度系統。它的典型使用場景包括:
- 大規模科學計算:在天氣預報、流體力學、天體物理等領域,需要運行數百甚至數千個核心並行計算的任務。
- 人工智能與深度學習:調度需要大量GPU資源的模型訓練任務,管理多個研究小組對稀缺GPU資源的共享使用。
- 生物信息學:處理基因組測序、分子動力學模擬等需要海量計算的分析流程。
- 工程仿真與材料科學:進行有限元分析、計算化學等複雜的模擬計算。
其重要性體現在:
- 從“混亂”到“有序”:沒有調度器,用户需要手動登錄到特定節點運行任務,極易引發資源衝突和系統不穩定。Slurm 將混亂的“自由競爭”轉變為有序的“按需分配”,保證了集羣的穩定性和公平性。
- 提升資源利用率:通過排隊和調度,Slurm 可以確保集羣7x24小時不間斷運行,讓昂貴的計算硬件投資發揮最大價值。
- 支持多用户環境:在高校或大型企業研發部門,Slurm 可以設定公平共享策略、資源限額和優先級,確保所有用户和項目組都能公平地獲得計算資源。
三、安裝Munge認證
1. 創建Munge用户
Munge用户要確保管理節點和計算(登錄)節點的UID和GID相同,所有節點都需要安裝Munge:
groupadd -g 1108 munge
useradd -m -c "Munge Uid 'N' Gid Emporium" -d /var/lib/munge -u 1108 -g munge -s /sbin/nologin munge
2. 生成熵池
- 管理節點執行
dnf install -y rng-tools
- 使用/dev/urandom來做熵源
# rngd -r /dev/urandom
# 修改service參數如下
nano /usr/lib/systemd/system/rngd.service
[Service]
ExecStart=/sbin/rngd -f -r /dev/urandom
- 管理節點啓動rngd
systemctl daemon-reload
systemctl start rngd
systemctl enable rngd
3. 部署Munge服務
- Munge是認證服務,實現本地或者遠程主機進程的UID、GID驗證。
dnf install epel-release -y
dnf install munge munge-libs munge-devel -y
注意:munge-devel如果在rocky9官方源找不到,請點擊以下鏈接進行查找:https://rockylinux.pkgs.org/9/rockylinux-devel-x86_64/munge-devel-0.5.13-13.el9.x86_64.rpm.html
- 在管理節點創建全局使用的密鑰:
/usr/sbin/create-munge-key -r
dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
- 密鑰同步到所有其他節點:(計算節點、登錄節點)
scp -p /etc/munge/munge.key root@login01:/etc/munge/
scp -p /etc/munge/munge.key root@compute01:/etc/munge/
scp -p /etc/munge/munge.key root@dcv01:/etc/munge/
# 所有節點賦權
chown munge: /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
- 所有節點都執行啓動命令:
systemctl start munge
systemctl enable munge
4. 測試Munge服務
每個節點與控制節點進行連接驗證
- 本地查看憑據:
munge -n
- 本地解碼:
munge -n | unmunge
- 驗證遠程解碼:
munge -n | ssh compute01 unmunge
- munge憑證基準測試:
remunge
四、編譯安裝Slurm
1. 安裝Mariadb
安裝mariadb,作為Slurm Accounting配置,在管理節點執行:
dnf -y install mariadb-server
systemctl start mariadb
systemctl enable mariadb
ROOT_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 16) #使用隨機密碼
mysql -e "CREATE USER root IDENTIFIED BY '${ROOT_PASS}'"
mysql -uroot -p$ROOT_PASS -e 'create database slurm_hpc_db'
- 創建數據庫slurm用户,並賦予數據庫slurm_hpc_db的所有權限
mysql -uroot -p$ROOT_PASS
create user slurm;
grant all on slurm_hpc_db.* TO 'slurm'@'localhost' identified by '123456' with grant option;
flush privileges;
2. 創建Slurm用户
- 所有節點執行,保證UID一致
groupadd -g 1109 slurm
useradd -m -c "Slurm manager" -d /var/lib/slurm -u 1109 -g slurm -s /bin/bash slurm
3. 安裝Slurm依賴
- 所有節點執行:
dnf install gcc gcc-c++ readline-devel perl-ExtUtils-MakeMaker pam-devel rpm-build mariadb-devel python3 -y
注意: 如mariadb-devel在官方鏡像源找不到,請點擊以下鏈接進行查找:https://rockylinux.pkgs.org/9/rockylinux-devel-x86_64/munge-devel-0.5.13-13.el9.x86_64.rpm.html
4. 編譯rpm包
- 下載slurm包
wget https://download.schedmd.com/slurm/slurm-25.05.2.tar.bz2
- 編譯slurm,使用rpmbuild製作rpm包
dnf install rpm-build -y
rpmbuild -ta --nodeps slurm-25.05.2.tar.bz2
- 將編譯好slurm的rpm包拷貝到其他節點
mkdir -p /root/rpmbuild/RPMS/
scp -r /root/rpmbuild/RPMS/x86_64 root@login01:/root/rpmbuild/RPMS/x86_64
scp -r /root/rpmbuild/RPMS/x86_64 root@compute01:/root/rpmbuild/RPMS/x86_64
5. 安裝配置Slurm
- 所有節點安裝Slurm
cd /root/rpmbuild/RPMS/x86_64/
dnf localinstall slurm-*
- 管理節點配置文件
cp /etc/slurm/cgroup.conf.example /etc/slurm/cgroup.conf
cp /etc/slurm/slurm.conf.example /etc/slurm/slurm.conf
cp /etc/slurm/slurmdbd.conf.example /etc/slurm/slurmdbd.conf
- 複製配置文件到其他節點
# slurmdbd.conf可不用複製
scp -r /etc/slurm/*.conf root@login01:/etc/slurm/
scp -r /etc/slurm/*.conf root@compute01:/etc/slurm/
- 設置各節點配置文件權限
mkdir /var/spool/slurmd
chown slurm: /var/spool/slurmd
mkdir /var/log/slurm
chown slurm: /var/log/slurm
mkdir /var/spool/slurmctld
chown slurm: /var/spool/slurmctld
mkdir /var/run/slurm
chown slurm: /var/run/slurm
- 啓動slurm服務
# 管理節點
systemctl start slurmdbd
systemctl enable slurmdbd
systemctl start slurmctld
systemctl enable slurmctld
# 所有節點
systemctl start slurmd
systemctl enable slurmd
- 可能遇到的報錯:
# 1. 啓動slurmdbd時報錯(一):
slurmdbd: fatal: slurmdbd.conf file /etc/slurm/slurmdbd.conf should be 600 is 644 acc... others
# 解決方法
chmod 600 slurmdbd.conf
systemctl restart slurmdbd
# 2. 啓動slurmdbd時報錯(二):
slurmdbd: fatal: slurmdbd.conf not owned by SlurmUser root!=slurm
# 解決方法
chown slurm: /etc/slurm/slurmdbd.conf
systemctl restart slurmdbd
五、配置文件參考
- slurm.conf
ClusterName=cluster
SlurmctldHost=manage01
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurm/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
StateSaveLocation=/var/spool/slurmctld
SwitchType=switch/none
TaskPlugin=task/affinity
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
AccountingStorageEnforce=associations,limits,qos
AccountingStorageHost=manage01
AccountingStoragePass=/var/run/munge/munge.socket.2
AccountingStoragePort=6819
AccountingStorageType=accounting_storage/slurmdbd
JobCompHost=localhost
JobCompLoc=slurm_hpc_db
JobCompPass=123456
JobCompPort=3306
JobCompType=jobcomp/mysql
JobCompUser=slurm
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
# HPC NODES
NodeName=manage01 NodeAddr=192.168.1.100 CPUs=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=200 Procs=1 State=UNKNOWN
NodeName=login01 NodeAddr=192.168.1.101 CPUs=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=200 Procs=1 State=UNKNOWN
NodeName=compute01 NodeAddr=192.168.1.102 CPUs=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1024 Procs=1 State=UNKNOWN
NodeName=dcv01 NodeAddr=192.168.1.12 CPUs=8 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=4096 Procs=1 State=UNKNOWN
# PARTITIONS
PartitionName=compute Nodes=compute01 Default=YES MaxTime=INFINITE State=UP
PartitionName=dcv Nodes=dcv01 Default=NO MaxTime=INFINITE State=UP
PartitionName=debug Nodes=dcv01,compute01,login01,manage01 Default=NO MaxTime=INFINITE State=UP
- slurmdbd.conf
# Authentication info
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
# slurmDBD info
DbdAddr=localhost
DbdHost=localhost
SlurmUser=slurm
DebugLevel=verbose
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurm/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
# Database info
StorageType=accounting_storage/mysql
StoragePass=123456
StorageUser=slurm
StorageLoc=slurm_hpc_db
- cgroup.conf
CgroupMountpoint=/sys/fs/cgroup
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes
六、總結
Slurm 是現代HPC集羣不可或缺的核心中間件。通過本教程,您將學習如何在 Rocky Linux 9 系統上從源碼編譯並安裝配置這一強大的調度系統,為構建您自己的高性能計算環境奠定堅實的基礎。