slurm HPC 安裝 Ubuntu
BUBU 因接了一個案子需要使用 Slurm
資源調度軟體,這樣子可以自動調度資源來去做任務的排程。
運行環境
環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式
- 系統環境: Ubuntu 22.04 ( KVM )
- 資料庫服務: MariaDB 10.11
安裝過程
目前所操作環境是 1 台主控、 2 台被控、 1 台資料庫、 1 台 NFS
資料分享
設定 NFS 服務
- 安裝
NFS
客戶端套件
sudo apt install nfs-common -y
- 先將所有相關
Slurm
都要先掛載好 NFS 服務,那 BUBU 都是使用NAS
方式來做分享使用
sudo mkdir /mnt/nas
- 設定掛載目錄位置
sudo mount -t nfs NFS位置:/xxxx/slurm /mnt/nas
- 設定
fstab
開機自動掛載
sudo echo 'NFS位置:/xxxx/slurm /mnt/nas /mnt/nas nfs auto,nfsvers=3,defaults 0 0' >> /etc/fstab
- 建立要分享的目錄
mkdir -p /mnt/nas/HPC_SYS/slurm
設定憑證
-
因
主控機
會去確認被控機
是否有正常連線及要排程派送需要使用到免輸入密碼方式來處理,因此各機需要生成一份憑證提供給主控機
來處理 -
生成憑證,在生成過程中會詢問一些問題,您可以直接用預設按下
Enter
或者您想要填入也可以
ssh-keygen -t rsa
- 把生成完的憑證用
rsync
同步到主控機
憑證位置在cd /root/.ssh/
rsync -avh id_rsa.pub root@主控機位置:/root/.ssh/id_rsa-s1.pub
cat id_rsa.pub >> authorized_keys
設定 Host
- 在各機設定
Host
讓站台服務可以快速連線,如果您內部有在使用DNS
服務可以省下這一步
sudo vim /etc/hosts
- 主控機
#loopback address
127.0.0.1 slurm-M
127.0.1.1 slurm-M
## SLURM cluster private IP range
# Controller
192.168.1.37 slurm-M
# compute nodes
192.168.1.38 slurm-S1
192.168.1.39 slurm-S2
# mariadb
192.168.1.44 slurm-DB
- 資料庫
#loopback address
127.0.0.1 slurm-DB
127.0.1.1 slurm-DB
## SLURM cluster private IP range
# Controller
192.168.1.37 slurm-M
# compute nodes
192.168.1.38 slurm-S1
192.168.1.39 slurm-S2
# mariadb
192.168.1.44 slurm-DB
- 被控機
#loopback address
127.0.0.1 slurm-Sx
127.0.1.1 slurm-Sx
## SLURM cluster private IP range
# Controller
192.168.1.37 slurm-M
# compute nodes
192.168.1.38 slurm-S1
192.168.1.39 slurm-S2
# mariadb
192.168.1.44 slurm-DB
設定主控機
- 安裝
pdsh
服務,pdsh
是一個可以跑remote shell command
的工具,也就是可以同時對多台主機進行command
的操作,方便後續對其他主機進行指令的操作。
sudo apt install pdsh -y
- 安裝
MUNGE key
服務
sudo apt install munge -y
- 啟動服務
sudo systemctl enable --now munge
- 複製所產生出來
MUNGE key
到分享目錄
cp /etc/munge/munge.key /mnt/nas/munge.key
- 遠端安裝各機的
MUNGE key
服務
sudo pdsh -w root@slurm-s[1-3],root@slurm-db -R ssh "apt install munge -y"
- 遠端複製
Munge Key
及 啟動服務
sudo pdsh -w root@slurm-s[1-2],root@slurm-db -R ssh "cp -a /mnt/nas/munge.key /etc/munge/munge.key"
sudo pdsh -w root@slurm-s[1-2],root@slurm-db -R ssh "chown munge:munge /etc/munge/munge.key"
sudo pdsh -w root@slurm-s[1-2],root@slurm-db -R ssh "systemctl enable --now munge"
- 安裝
Slurm
服務
sudo apt update && sudo apt install slurm-wlm slurm-wlm-doc -y
- 遠端安裝 被控機 的
Slrum
服務
sudo pdsh -w root@slurm-s[1-2] -R ssh "apt install slurmd -y"
- 設定軟連接
sudo cp /mnt/nas/HPC_SYS/slurm/slurm.conf /etc/slurm/slurm.conf
sudo cp /mnt/nas/HPC_SYS/slurm/slurmdbd.conf /etc/slurm/slurmdbd.conf
sudo cp /mnt/nas/HPC_SYS/slurm/cgroup.conf /etc/slurm/cgroup.conf
sudo cp /mnt/nas/HPC_SYS/slurm/cgroup_allowed_devices_file.conf /etc/slurm/cgroup_allowed_devices_file.conf
- 設定權限
sudo chown slurm: /etc/slurm/slurm.conf
sudo chown slurm: /etc/slurm/slurmdbd.conf
sudo chown slurm: /etc/slurm/cgroup.conf
sudo chown slurm: /etc/slurm/cgroup_allowed_devices_file.conf
- 遠端複製設定檔
被控機
跟資料庫
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "cp /mnt/nas/HPC_SYS/slurm/slurm.conf /etc/slurm/slurm.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "cp /mnt/nas/HPC_SYS/slurm/slurmdbd.conf /etc/slurm/slurmdbd.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "cp /mnt/nas/HPC_SYS/slurm/cgroup.conf /etc/slurm/cgroup.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "cp /mnt/nas/HPC_SYS/slurm/cgroup_allowed_devices_file.conf /etc/slurm/cgroup_allowed_devices_file.conf"
- 遠端修改權限
被控機
跟資料庫
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "chown slurm: /etc/slurm/slurm.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "chown slurm: /etc/slurm/slurmdbd.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "chown slurm: /etc/slurm/cgroup.conf"
pdsh -w root@slurm-S[1-2],root@slurm-DB -R ssh "chown slurm: /etc/slurm/cgroup_allowed_devices_file.conf"
設定資料庫
-
BUBU 資料庫是用
Mariadb
來服務的,當下所安裝的版本是10.11
,相關安裝方式可以參考本站所編寫的文章 在 Linux 系統上安裝 MariaDB -
安裝
Slurm
服務
sudo apt install slurmdbd -y
設定被控機
因後期的 Ubunt
使用 Cgroup
版本是 2 版,那 Slurm
目前還尚未支援到 Cgroup 2
版,因此需要再去設定啟用 Cgroup 1
版的設定來混合使用
- 設定
GRUB
vim /etc/default/grub
- 修改
GRUB_CMDLINE_LINUX=""
後面新增加以下內容
GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0 systemd.legacy_systemd_cgroup_controller=1"
- 更新設定並且重啟服務
sudo update-grub && sudo reboot
- 重啟服務確認是否有正常啟用服務
mount | grep cgroup
- 如果有看到以下的內容表示
Cgroup v1
的Memory
控制器已啟用
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime)
- 確認
/sys/fs/cgroup
權限正確
ls -ld /sys/fs/cgroup
- 權限不正確再設定下面的指令
sudo chown root:root /sys/fs/cgroup
sudo chmod 755 /sys/fs/cgroup
- 啟動
Slurm
服務
systemctl enable --now slurmd
服務的參數設定
slurm 設定檔
- 設定
vim slurm.conf
#################################################
# 一般設定
#################################################
# 定義叢集名稱
ClusterName=testp
# 指定主控節點的主機名稱
SlurmctldHost=slurm-M
# 使用 cgroup 來追蹤程序,提供更好的資源控制和隔離
ProctrackType=proctrack/cgroup
# 節點恢復服務時的處理方式:2 表示節點重新上線時自動恢復服務
ReturnToService=2
# 控制守護程序的 PID 檔案位置
SlurmctldPidFile=/run/slurmctld.pid
# 計算節點守護程序的 PID 檔案位置
SlurmdPidFile=/run/slurmd.pid
# 計算節點的暫存目錄位置
SlurmdSpoolDir=/var/lib/slurm/slurmd
# 狀態儲存位置
StateSaveLocation=/var/lib/slurm/slurmctld
# 指定執行 SLURM 的系統使用者
SlurmUser=slurm
# 使用 cgroup 進行工作控制和 CPU 親和性管理
TaskPlugin=task/cgroup,task/affinity
#################################################
# 排程設定
#################################################
# 使用反填式排程器
SchedulerType=sched/backfill
# 使用 TRES(可追蹤資源)的資源選擇器
SelectType=select/cons_tres
# 依據核心和記憶體進行資源選擇
SelectTypeParameters=CR_Core_Memory
#################################################
# 記錄和會計設定
#################################################
# 使用 slurmdbd 進行會計儲存
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=slurm-DB
# 會計資料庫使用者
AccountingStorageUser=slurm_usr
# 停用工作完成記錄
JobCompType=jobcomp/none
# 使用 cgroup 收集工作會計資訊
JobacctGatherType=jobacct_gather/cgroup
# 控制器除錯層級
SlurmctldDebug=info
# 控制器日誌檔位置
SlurmctldLogFile=/var/log/slurm/slurmctld.log
# 計算節點除錯層級
SlurmdDebug=info
# 計算節點日誌檔位置
SlurmdLogFile=/var/log/slurm/slurmd.log
# 排程器日誌檔位置
SlurmSchedLogFile=/var/log/slurm/slurmschd.log
# 排程器日誌層級 (1-4)
SlurmSchedLogLevel=3
# 啟用容器化功能
PrologFlags=Contain
# 基本服務端口設定
SlurmctldPort=6817 # slurmctld 使用的埠號
SlurmdPort=6818 # slurmd 使用的埠號
#################################################
# 搶占設定
#################################################
# 使用分區優先級進行搶占
PreemptType=preempt/partition_prio
# 搶占時重新排隊工作
PreemptMode=REQUEUE
#################################################
# 節點設定
#################################################
# 定義工作節點 1:2 CPU cores,1963MB 記憶體
#NodeName=slurm-S1 CPUs=2 RealMemory=1963
NodeName=slurm-S1 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=1024 State=UNKNOWN
# 定義工作節點 2:2 CPU cores,1963MB 記憶體
# NodeName=slurm-wrk-02 CPUs=2 RealMemory=1963
#################################################
# 分區設定
#################################################
# 定義預設分區,包含所有節點,無時間限制,狀態為啟用
PartitionName=testp Nodes=ALL Default=YES MaxTime=INFINITE State=UP
slurmdbd 設定檔
- 設定
vim slurmdbd.conf
# -------------------------------
# 認證設定
# -------------------------------
# 使用 Munge 進行身份驗證,確保所有節點都使用相同的 Munge 金鑰
AuthType=auth/munge
# Munge 通訊 socket 位置,確保 `/var/run/munge/munge.socket.2` 存在且可存取
AuthInfo=/var/run/munge/munge.socket.2
# -------------------------------
# SlurmDBD 服務設定
# -------------------------------
# 指定 SlurmDBD 服務監聽的 IP 地址
DbdAddr=SlurmDBD 連線位置
# 指定 SlurmDBD 服務的主機名稱,應與 `slurm.conf` 中的 `AccountingStorageHost` 一致
DbdHost=slurm-DB
# SlurmDBD 服務的通訊埠,預設為 6819,確保此埠未被防火牆阻擋
DbdPort=6819
# -------------------------------
# 記錄檔與偵錯設定
# -------------------------------
# 設定 SlurmDBD 服務的日誌記錄等級
# 可選值: quiet, fatal, error, info, verbose, debug, debug2, debug3, debug4, debug5
DebugLevel=info
# 指定 SlurmDBD 服務的日誌存放位置
LogFile=/var/log/slurm/slurmdbd.log
# 指定 SlurmDBD 服務的 PID 檔案存放位置
PidFile=/var/run/slurmdbd.pid
# -------------------------------
# 記帳系統 (Accounting Storage) 設定
# -------------------------------
# 指定記帳存儲後端類型,這裡選擇 MySQL
StorageType=accounting_storage/mysql
# MySQL 資料庫主機地址
StorageHost=資料庫連線位置
# MySQL 連接埠,預設為 3306
StoragePort=3306
# MySQL 資料庫用戶名 (用於 Slurm 記帳)
StorageUser=slurm_usr
# MySQL 資料庫密碼 (用於 Slurm 記帳)
StoragePass=password
# 指定 Slurm 使用的 MySQL 資料庫名稱
StorageLoc=slurm_acc_db
# -------------------------------
# 權限與執行用戶設定
# -------------------------------
# 指定運行 SlurmDBD 服務的使用者
# 該使用者需要擁有對 `/var/log/slurm/` 和 `/var/run/slurmdbd.pid` 的寫入權限
SlurmUser=slurm
cgroup 設定檔
- 設定
vim cgroup.conf
# -------------------------------
# SLURM Cgroup 相關設定 (cgroup.conf)
# -------------------------------
# 啟用 Cgroup 自動掛載
# 設定為 "yes" 時,SLURM 會自動掛載並使用 Cgroup 來管理資源分配。
# 如果系統已經手動掛載了 Cgroup,則可以設為 "no"。
CgroupAutomount=yes
# 限制每個作業可使用的 CPU 核心數
# 當設為 "yes" 時,SLURM 會使用 Cgroup 來限制作業的 CPU 使用範圍,
# 確保作業不會佔用未分配的核心,避免影響其他作業的執行。
ConstrainCores=yes
# 限制每個作業可使用的記憶體 (RAM) 空間
# 當設為 "yes" 時,SLURM 會使用 Cgroup 來強制執行記憶體限制,
# 確保作業不會超出 SLURM 配置的記憶體上限,防止某些作業因記憶體洩漏影響整個節點。
ConstrainRAMSpace=yes
cgroup 設定允許訪問設備及目錄
- 設定
vim cgroup_allowed_devices_fil
# 允許作業訪問 /dev/null (黑洞設備,用於丟棄輸出)
/dev/null
# 允許訪問 /dev/urandom (隨機數生成器)
/dev/urandom
# 允許訪問 /dev/zero (回傳 0 的特殊設備)
/dev/zero
# 允許訪問所有以 /dev/sda 開頭的設備 (主要是磁碟分區,如 /dev/sda1, /dev/sda2)
/dev/sda*
# 允許訪問 CPU 相關設備 (如 /dev/cpu/microcode)
/dev/cpu/*/*
# 允許訪問虛擬終端 (Pseudo-Terminal Devices)
/dev/pts/*