跳到主內容

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
  • 生成完之後再把公鑰生成為 authorized_keys
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 v1Memory 控制器已啟用
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/*           

補充說明


備註





參考相關網頁