為了更有效地管理和分配資源,最佳化作業調度,提升系統利用率,並滿足多樣化的作業需求,隊列成為任務調度中不可或缺的配置項。合理的隊列設定能夠確保高優先順序的任務優先獲得所需資源,從而最大化資源利用效率。本文介紹在Slurm系統內容下,當出現作業提交或作業狀態變化時,如何通過恰當的隊列配置策略來實現儘可能多的任務調度處理,以達到最佳效能。
1. Slurm核心功能
資源分派:按需分配CPU/記憶體/GPU等資源,避免衝突與浪費;
作業調度:動態調度作業隊列,按優先順序執行並全程監控任務狀態;
優先順序控制:高優先順序隊列任務優先調度;
監控工具:通過
scontrol/sacct監控資源使用及作業狀態;定製化支援:多隊列適配不同需求(如CPU密集/記憶體/GPU任務);
系統最佳化:提升資源使用率,減少空閑時間,提高計算效率。
本文基於Slurm 24.05版本進行總結,其他版本可能存在差異。
2. Slurm隊列類型
Slurm任務按優先順序排序執行,若分區存在不可調度任務,則後續任務暫停。高優先順序任務可搶佔低優先順序任務資源,被搶佔任務可以取消、重設或掛起。如果您啟用回填調度(預設),按bf_interval周期計算低優任務能否在不延遲高優任務前提下運行,需佔用整機資源並可能觸發整機搶佔。調度配置通過slurm.conf指定SchedulerType(預設sched/backfill外掛程式)及詳細參數SchedulerParameters,具體參數配置,請參見官方文檔。
在調度過程中,所有任務都會被整合到一個列表中,並通過不同的優先順序演算法來確定執行順序。Slurm支援以下兩種隊列類型:
先進先出(FIFO)隊列,任務的排序依據是它們提交的時間順序。
多因素(MultiFactors)隊列,是一種更進階的任務排隊機制,預設處於啟用狀態,它能夠根據多個因素綜合計算作業的優先順序。
2.1 先進先出隊列
預設情況下,Slurm採用先進先出FIFO為基礎分配作業優先順序。關於優先順序調度的設定檔存放在slurm.conf中,可以通過修改參數PriorityType來配置優先順序。
# 1.找到並編輯slurm.conf檔案
sudo nano /etc/slurm-llnl/slurm.conf
# 2.啟用搶佔模式,並指定基於先進先出優先順序的搶佔策略
PriorityType=priority/basic 建議您在變更之前備份原始的slurm.conf檔案,以防萬一出現問題時能夠恢複。此外,對於生產環境中的任何重大改動,建議先在一個測試環境中進行全面測試。
2.2 多因素作業隊列
Slurm多因素調度通過加權計算以下因子確定任務優先順序:作業執行時間長度、資源差異(已指派vs已消耗)、作業規模、使用者參數、資料分區、TRES(資源等價值)類型及服務品質(QOS)。權重分配與具體計算邏輯,請參見多因素優先順序配置說明。
Job_priority =
site_factor +
(PriorityWeightAge) * (age_factor) +
(PriorityWeightAssoc) * (assoc_factor) +
(PriorityWeightFairshare) * (fair-share_factor) +
(PriorityWeightJobSize) * (job_size_factor) +
(PriorityWeightPartition) * (priority_job_factor) +
(PriorityWeightQOS) * (QOS_factor) +
SUM(TRES_weight_cpu * TRES_factor_cpu,
TRES_weight_<type> * TRES_factor_<type>,
...)
- nice_factorSlurm作業優先順序通過以下加權因子計算:
基礎值:
site_factor(自訂分值)。作業等待時間權重:作業等待時間越長,權重越高(
PriorityWeightAge × age_factor)。關聯權重:使用者組/賬戶的資源使用公平性(
PriorityWeightAssoc × assoc_factor)。公平共用權重:按資源使用比例調整分值(
PriorityWeightFairshare × fair-share_factor)。作業大小權重:小/大作業優先(
PriorityWeightJobSize × job_size_factor)。分區權重:分區優先順序(
PriorityWeightPartition × priority_job_factor)。QoS權重:服務品質等級(
PriorityWeightQOS × QOS_factor)。資源權重:資源類型(CPU/GPU等)權重加權。
Nice降級:
- nice_factor(數值越大,優先順序越低)。
您可以通過動態調整權重參數,實現公平、高效的任務調度。
典型應用樣本。
快速完成小作業:
設定
PriorityWeightJobSize=-1,大作業的優先順序降低,小作業更快被調度。保障關鍵使用者/組:
通過
PriorityWeightAssoc和Fair-share_factor確保重要團隊的作業優先運行。資源饑餓保護:
配置
PriorityWeightFairshare=2000,低資源使用量的使用者作業優先順序顯著提升。
樣本:設定多因素作業優先順序
自訂設定分區優先順序
Slurm可通過組織架構劃分機器,限制任務僅在所屬資源集區運行。任務分緊急(搶佔低優先順序任務)與非緊急(快速執行但不阻塞緊急任務)。當任務接近截止時間需標記為緊急時,Slurm無法自動調整,需人工手動遷移至高優先順序隊列。
您可以建立兩個指向同一節點池的分區(區分緊急/非緊急任務),通過切換任務所屬分區實現優先順序動態調整,提升資源使用率並簡化營運。支援靈活調度動態負載,同時降低管理複雜度。不僅可以讓系統更好地適應動態變化的工作負載需求,同時也簡化了營運人員對複雜作業環境下的管理工作,您可參考以下步驟進行設定。
首先在叢集中開啟搶佔功能開關,並將搶佔類型設定為
preempt/partition_prio。# 1.找到並編輯slurm.conf檔案 sudo nano /etc/slurm-llnl/slurm.conf # 2.啟用搶佔模式,並指定基於分區優先順序的搶佔策略 PreemptMode=preempt/partition_prio # 3.當作業被搶佔時的行為,定義了當一個作業被搶佔時會發生什麼。 # cancel表示取消該作業;suspend則會暫停它直到資源再次可用。選擇哪個取決於你的需求。 PreemptType=suspend # 或者 "cancel"重要建議您在變更之前備份原始的
slurm.conf檔案,以防萬一出現問題時能夠恢複。此外,對於生產環境中的任何重大改動,建議先在一個測試環境中進行全面測試。在叢集中添加一個高優先順序分區,通常可以使用以下命令,或者可以在slurm.conf中新增一條分區記錄。
scontrol create partition=hipri PriorityTier=2 nodes=ALL之後即可通過向hipri分區提交任務或者將任務更改到高優分區的方式來實現任務搶佔,以下是任務提交樣本。# 1.在slurm叢集中添加一個高優先順序分區 root@slurm-test-0:/# scontrol create partition=hipri PriorityTier=2 nodes=ALL # 2.查看當前的叢集分區 root@slurm-test-0:/# scontrol show partition # 結果 PartitionName=debug AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=YES QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED Nodes=slurm-test-worker-cpu-0 PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=FORCE:1 OverTimeLimit=NONE PreemptMode=GANG,SUSPEND State=UP TotalCPUs=4 TotalNodes=1 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED TRES=cpu=4,mem=6401M,node=1,billing=4 ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO PartitionName=hipri AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=NO QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 LLN=NO MaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED Nodes=slurm-test-worker-cpu-0 PriorityJobFactor=1 PriorityTier=2 RootOnly=NO ReqResv=NO OverSubscribe=NO OverTimeLimit=NONE PreemptMode=GANG,SUSPEND State=UP TotalCPUs=0 TotalNodes=0 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED TRES=(null) ResumeTimeout=GLOBAL SuspendTimeout=GLOBAL SuspendTime=GLOBAL PowerDownOnIdle=NO # 連續提交4個任務 root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & root@slurm-test-0:/# srun sleep 1d & # 查看當前叢集狀態 root@slurm-test-0:/# squeue # 當前叢集有4個正在啟動並執行任務 JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 debug sleep root R 0:03 1 slurm-test-worker-cpu-0 2 debug sleep root R 0:04 1 slurm-test-worker-cpu-0 3 debug sleep root R 0:04 1 slurm-test-worker-cpu-0 1 debug sleep root R 0:05 1 slurm-test-worker-cpu-0 # 在高優先順序分區提交任務 root@slurm-test-0:/# srun --partition=hipri sleep 1d & root@slurm-test-0:/# squeue # 任務4的ST(狀態)從R變為了S,任務5的狀態變為了R,說明任務4被掛起 JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 2 debug sleep root R 1:06 1 slurm-test-worker-cpu-0 3 debug sleep root R 1:06 1 slurm-test-worker-cpu-0 1 debug sleep root R 1:07 1 slurm-test-worker-cpu-0 4 debug sleep root S 0:59 1 slurm-test-worker-cpu-0 5 hipri sleep root R 0:06 1 slurm-test-worker-cpu-0 # 提交低優任務 root@slurm-test-0:/# srun sleep 1d & # 更新任務為高優任務 root@slurm-test-0:/# scontrol update jobid=6 partition=hipri root@slurm-test-0:/# squeue # 任務1和2變為了掛起狀態,這是由於同分區的任務會共用執行時間,因此1,2,3,4會通過分時的方式執行 JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 debug sleep root R 3:21 1 slurm-test-worker-cpu-0 3 debug sleep root R 3:33 1 slurm-test-worker-cpu-0 2 debug sleep root S 3:41 1 slurm-test-worker-cpu-0 1 debug sleep root S 4:01 1 slurm-test-worker-cpu-0 6 hipri sleep root R 0:03 1 slurm-test-worker-cpu-0 5 hipri sleep root R 3:33 1 slurm-test-worker-cpu-0
自訂設定QOS服務品質優先順序
Slurm需配置高/低優先順序QOS(預設已存在優先順序0的normal),並通過sacctmgr建立高優QOS啟用搶佔。需在slurm.conf開啟搶佔功能(如PreemptMode=priority),但需注意:若PreemptType=SUSPEND,GANG,高優任務搶佔後,低優任務會以分時模式與高優任務共存(非完全中斷)。配置QOS需要使用sacctmgr工具,以下是建立一個高優QOS的常用命令。
sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10preempt=normal:指定highQoS可搶佔normalQoS的任務。preemptmode=gang,suspend:Gang模式:搶佔任務需完全擷取資源後才開始執行。
Suspend模式:被搶佔任務暫停而非終止,釋放資源供搶佔者使用,待搶佔任務結束時恢複執行。
priority=10:highQoS任務預設優先順序基分為10(數值越高優先順序越高)。
在slurm.conf中開啟搶佔相關開關涉及到以下參數,同時在配置Partition時,需要在配置的最後增加OverSubscribe=FORCE:1。
以下是一個使用了不同QoS進行任務搶佔管理的例子:
# 查看當前QOS
root@slurm-test-0:/# sacctmgr show qos format=name
Name
----------
normal
# 建立高優QOS
root@slurm-test-0:/# sacctmgr add qos high preempt=normal preemptmode=gang,suspend priority=10
Adding QOS(s)
high
Settings
Description = high
Preempt = normal
PreemptMode = GANG,SUSPEND
Priority = 10
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
# 查看當前QOS
root@slurm-test-0:/# sacctmgr show qos format=name,priority,preempt
Name Priority Preempt
---------- ---------- ----------
normal 0
high 10 normal
# test.sh的內容如下
# #!/bin/bash
# srun sleep 10m
# 連續提交五個任務
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 4
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 5
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 6
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 7
root@slurm-test-0:/# sbatch test.sh
Submitted batch job 8
root@slurm-test-0:/# squeue # 任務8處於Pending狀態
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
8 debug test.sh root PD 0:00 1 (Resources)
7 debug test.sh root R 0:03 1 slurm-test-worker-cpu-0
5 debug test.sh root R 0:15 1 slurm-test-worker-cpu-0
6 debug test.sh root R 0:15 1 slurm-test-worker-cpu-0
4 debug test.sh root R 0:18 1 slurm-test-worker-cpu-0
root@slurm-test-0:/# sbatch --qos=high test.sh # 向高優QOS提交任務
Submitted batch job 9
root@slurm-test-0:/# squeue # 高優QOS開始執行,通過分時的方式與其他任務共用資源
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
8 debug test.sh root PD 0:00 1 (Resources)
7 debug test.sh root R 0:26 1 slurm-test-worker-cpu-0
5 debug test.sh root R 0:38 1 slurm-test-worker-cpu-0
6 debug test.sh root R 0:38 1 slurm-test-worker-cpu-0
4 debug test.sh root R 0:41 1 slurm-test-worker-cpu-0
9 debug test.sh root S 0:00 1 slurm-test-worker-cpu-0
自訂設定作業大小優先順序
作業大小優先順序是由PriorityWeightJobSize和PriorityWeightAge=1000共同決定。
作業大小因素
非緊急任務需高效利用叢集資源(不超期限)。當任務執行時間未知時,回填調度失效,此時優先調度小任務減少隊頭阻塞,同時依據排隊時間提升大任務優先順序防餓死;臨近截止的大任務可搶佔小任務資源(掛起小任務直至其完成)。
為提高非緊急任務叢集利用率(不超過截止時間),您可以採取以下策略進行設定:
優先調度小任務減少隊頭阻塞。
按排隊時間長度提升大任務優先順序防餓死。
臨近截止的大任務可搶佔小任務資源(小任務掛起至其完成)。任務執行時間未知時,回填調度失效,需以上機制保障資源高效利用。
通過實施上述措施,可以在保證關鍵任務按時完成的同時最大化利用叢集資源,同時也兼顧了不同類型任務之間的平衡。
在slurm.conf中需要進行如下的配置(這裡只展示特殊配置,slurm.conf中的其他配置不受影響):
PriorityFavorSmall=YES PriorityWeightAge=1000 PriorityWeightJobSize=1000 PriorityMaxAge=1-0作業等待時間因素
當設定完成作業大小優先順序後,提交後等待時間為第二因素。Slurm通過工作要求資源與叢集總資源的佔比計算任務大小得分;若啟用
PriorityFavorSmall=YES,得分公式為:得分 = (1 - 資源佔比) × PriorityWeightJobSize。例如,當叢集可用4核CPU時:請求1核任務得分:
(1 - 1/4) × 權重 = 0.75×權重 → 樣本得分為0.375(若權重為0.5)。請求4核任務得0分(完全佔用資源)。
AgeFactor優先順序計算:
超過
PriorityMaxAge的任務:直接得PriorityWeightAge全分。其他任務按提交時間佔比得分,例如設定
PriorityWeightAge=1000時,每分鐘增加約0.69分,累計至24小時後得滿分1000。
回填調度建議,若可預估任務執行時間,建議啟用預設的回填調度(或手動設定
SchedulerType=sched/backfill),使其通過時間表調度小任務填充至大任務空閑時段。結合系統預設的大任務優先機制及臨近截止時間搶佔功能,可平衡資源使用率與公平性。