叢集手冊/SLURM
叢集是一個需要控制和管理的資源網路,以實現無錯誤的過程。節點必須能夠相互通訊,通常分為兩類 - 登入節點(也稱為主節點或伺服器節點)和工作節點(也稱為客戶端節點)。通常使用者無法直接訪問工作節點,但可以在所有節點上執行程式。通常有幾個使用者為自己申領資源。因此,這些資源的分配不能由使用者自己設定,而是根據特定的規則和策略進行。所有這些任務都由作業和資源管理系統 - 批處理系統來處理。
批處理系統是管理資源的服務,也是使用者的介面。使用者傳送作業 - 帶有執行和所需資源和條件描述的任務。所有作業都必須由批處理系統管理。批處理系統的主要元件是伺服器和客戶端。伺服器是主要元件,提供用於監控的介面。伺服器的主要任務是將資源管理到註冊的客戶端。客戶端的主要任務是執行待處理的程式。客戶端還會收集有關程式過程和系統狀態的所有資訊。這些資訊可以根據請求提供給伺服器。批處理系統的第三個可選元件是排程程式。一些批處理系統內建了排程程式,但都提供了將外部排程程式整合到系統中的選項。排程程式根據某些規則設定:誰、何時以及可以使用多少資源。具有上述所有元件的批處理系統是 SLURM,本節將介紹其背景資訊以及安裝和使用說明。Qlustar 也集成了 SLURM。
SLURM(Simple Linux Utility for Resource Management)是一個免費的批處理系統,集成了作業排程程式。SLURM 由勞倫斯利弗莫爾國家實驗室、SchedMD、Linux Networx、惠普和布林集團於 2002 年聯合開發而成。很快,100 多名開發人員參與了該專案。這些努力的結果是一個軟體,該軟體用於 TOP-500 列表中的許多高效能計算機(也是目前最快的 天河二號[1])。SLURM 的特點是容錯能力非常高、可擴充套件性和效率高。守護程序(參見第 5.3 節)有備份,以及各種動態響應錯誤的選項。它可以管理超過 100,000 個作業,每秒高達 1000 個作業,每秒可以執行高達 600 個作業。目前未使用的節點可以關閉以節省電力。此外,SLURM 具有相當高的跨多種作業系統的相容性。最初為 Linux 開發,今天支援更多平臺:AIX、*BSD(FreeBSD、NetBSD 和 OpenBSD)、Mac OS X、Solaris。也可以將不同的系統交叉連結並在其上執行作業。對於排程,已經開發出了一個成熟的概念,並具有多種選項。透過策略選項,可以生成許多級別,每個級別都可以管理。因此,可以整合一個數據庫,其中可以記錄使用者組和專案,這些組和專案受其自身規則約束。使用者還可以根據其所屬的組或專案來分配權利。SLURM 是一個正在開發的活躍專案。2010 年,開發人員建立了 SchedMD 公司,併為 SLURM 提供付費支援。S
SLURM 的核心是兩個守護程序[2] - slurmctld 和 slurmd。兩者都可以有備份。顧名思義,Controldaemon 執行在伺服器上。它初始化、控制和記錄資源管理器的所有活動。該服務分為三個部分 - 作業管理器,它管理等待作業的佇列;節點管理器,它儲存節點的狀態資訊;分割槽管理器,它分配節點。第二個守護程序執行在每個客戶端上。它執行來自 slurmctld 和 srun 的所有指令。使用特殊命令 scontrol,客戶端會進一步將其狀態資訊擴充套件到伺服器。如果連線建立,則可以從伺服器訪問各種 SLURM 命令。其中一些理論上可以從客戶端呼叫,但通常僅在伺服器上執行。

在圖 5.1 中,舉例說明了一些命令。下面將詳細解釋五個最重要的命令。
此命令顯示節點和分割槽資訊。使用其他選項可以過濾和排序輸出。
- 清單 5.1
sinfo命令的輸出。
- 清單 5.1
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug* up infinite 1 down* worker5
debug* up infinite 1 alloc worker4PARTITION 列顯示了分割槽名稱。星號表示預設名稱。AVAIL 列指的是分割槽,可能顯示為 up 或 down。TIME LIMIT 顯示使用者指定的時間限制。如果沒有指定,則認為值為無限。STATE 表示列出節點的 NODES 狀態。可能的狀態為 和 ,其中相應的縮寫如下:alloc、comp、donw、drain、drng、fail、failg、idle 和 unk。星號表示未收到節點的反饋。NodeList 顯示配置檔案中設定的節點名稱。該命令可以接受多個選項,一方面可以查詢附加資訊,另一方面可以根據需要格式化輸出。完整列表 - https://computing.llnl.gov/linux/slurm/sinfo.html PARTITION 列顯示了分割槽名稱。星號表示預設名稱。AVAIL 列指的是分割槽,可能顯示為 up 或 down。TIME LIMIT 顯示使用者指定的時間限制。如果沒有指定,則認為值為無限。STATE 表示列出節點的 NODES 狀態。可能的狀態為 和 ,其中相應的縮寫如下:alloc、comp、donw、drain、drng、fail、failg、idle 和 unk。星號表示未收到節點的反饋。NodeList 顯示配置檔案中設定的節點名稱。該命令可以接受多個選項,一方面可以查詢附加資訊,另一方面可以根據需要格式化輸出。完整列表 - https://computing.llnl.gov/linux/slurm/sinfo.html
srun
[edit | edit source]使用此命令,您可以互動式地傳送作業和/或分配節點。
- 清單 5.2 互動式
srun使用。
- 清單 5.2 互動式
$ srun -N 2 -n 2 hostname 在此示例中,您要執行 2 個節點,總共 (不是每個節點) 2 個 CPU hostname。
- 清單 5.3 帶有某些選項的
srun命令。
- 清單 5.3 帶有某些選項的
$ srun -n 2 --partition=pdebug --allocate 使用 –allocate 選項,您可以分配預留的資源。在這種情況下,可以執行程式,這些程式不會超出註冊資源的範圍。
選項完整列表 - https://computing.llnl.gov/linux/slurm/srun.html
scancel
[edit | edit source]此命令用於中止作業或一個或多個作業步驟。作為引數,您傳遞要停止的作業的 ID。允許取消哪些作業取決於使用者的許可權。
- 清單 5.4 帶有某些選項的
scancel命令。
- 清單 5.4 帶有某些選項的
$ scancel --state=PENDING --user=fuchs --partition=debug 在示例中,您要取消所有處於 狀態、屬於使用者 fuchs 且位於分割槽 debug 中的作業。如果您沒有許可權,輸出將相應顯示。
選項完整列表 - https://computing.llnl.gov/linux/slurm/scancel.html
squeue
[edit | edit source]此命令顯示作業特定的資訊集。同樣,可以控制輸出和有關附加選項的資訊範圍。
- 清單 5.5
squeue命令的輸出。
- 清單 5.5
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
2 debug script1 fuchs PD 0:00 2 (Ressources)
3 debug script2 fuchs R 0:03 1 worker4JOBID 表示作業的識別號碼。NAME 列顯示作業對應的 ID 名稱,並且可以手動修改或擴充套件。ST 是作業的狀態,例如示例中的 PD - 或 R - (還有許多其他狀態)。相應地,TIME 下的計時器僅對狀態設定為 的作業執行。此時間沒有限制,而是作業的當前執行時間。如果作業處於掛起狀態,計時器將保持在 0:00。作業未執行的原因將在下一列中顯示。在 NODES 下,您可以看到作業所需的節點數量。當前作業只需要一個節點,而等待的作業需要兩個節點。最後一列還顯示了作業未執行的原因,例如 (Ressources)。要獲取更詳細的資訊,必須傳遞其他選項。
完整列表 - https://computing.llnl.gov/linux/slurm/squeue.html
scontrol
[edit | edit source]此命令用於檢視或修改一個或多個作業的 SLURM 配置。大多數操作只能由 root 執行。您可以直接在呼叫後寫入所需的選項和命令,或者單獨呼叫 scontrol 並繼續在此上下文中工作。
- 清單 5.6 使用
scontrol命令。
- 清單 5.6 使用
$ scontrol
scontrol: show job 3
JobId=3 Name=hostname
UserId=da(1000) GroupId=da(1000)
Priority=2 Account=none QOS=normal WCKey=*123
JobState=COMPLETED Reason=None Dependency=(null)
TimeLimit=UNLIMITED Requeue=1 Restarts=0 BatchFlag=0 ExitCode=0:0
SubmitTime=2013-02-18T10:58:40 EligibleTime=2013-02-18T10:58:40
StartTime=2013-02-18T10:58:40 EndTime=2013-02-18T10:58:40
SuspendTime=None SecsPreSuspend=0
Partition=debug AllocNode:Sid=worker4:4702
ReqNodeList=(null) ExcNodeList=(null)
NodeList=snowflake0
NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqS:C:T=1:1:1
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) Reservation=(null)
scontrol: update JobId=5 TimeLimit=5:00 Priority=10此示例顯示了從上下文中使用該命令的方式。可以使用特定的查詢設定要獲取的資訊量。
完整選項列表 - https://computing.llnl.gov/linux/slurm/scontrol.html
操作模式
[edit | edit source]基本上有兩種操作模式。您可以從伺服器以互動方式呼叫已編譯的程式。在這裡,您可以提供一些選項,例如程式要執行的節點數和程序數。編寫作業指令碼要便宜得多,在作業指令碼中,可以清楚地保留選項或對其進行註釋。以下部分提供了互動模式中選項的語法和語義,並解釋了作業指令碼。
互動式
[edit | edit source]這裡的關鍵命令是 srun。因此,您可以以互動方式執行作業並分配資源。後面跟著傳遞給批處理系統的選項。有一些選項的值是在 SLURM 中為環境變數設定的(請參閱第 5.3 節)。
作業指令碼
[edit | edit source]作業指令碼是一個檔案,例如包含 shell 命令。沒有輸入或輸出引數。在作業指令碼中,環境變數直接設定。因此,需要用 #SBATCH 標記行。以井號開頭的其他行是註釋。作業指令碼的主要部分是程式呼叫。但是,可以選擇傳遞與互動模式類似的其他引數。
- 清單 5.7 作業指令碼示例。
#!/bin/sh
# Time limit in minutes.
#SBATCH --time=1
# A total of 10 processes at 5 knots
#SBATCH -N 5 -n 10
# Output after job.out, Errors after job.err.
#SBATCH --error=job.err --output=job.out
srun hostname
該指令碼按通常方式呼叫,並執行所有包含的命令。一個作業指令碼可以包含多個程式呼叫,甚至來自不同程式的呼叫。每個程式呼叫都可以附加冗餘選項,這些選項可以覆蓋環境變數。如果沒有進一步的說明,指令碼開頭指定的選項將適用。
安裝
[edit | edit source]安裝 SLURM 與其他軟體一樣,可以透過完成的 Ubuntu 包安裝,也可以手動安裝,但手動安裝要複雜得多。對於當前版本,仍然沒有完成的軟體包。如果不需要下面列出的新版本的優勢,則舊版本就足夠了。以下各節提供了兩種方法的說明。2.5.3 版本中的改進
- 消除了作業依賴項中的競爭條件
- 有效清理已終止的作業
- 正確處理
glib和gtk - 修復了針對較新編譯器的錯誤
- 更好的 GPU 支援
軟體包
[edit | edit source]預製軟體包包含版本 2.3.2。使用
$ apt-get install slurm-llnl 您下載了該軟體包。在第二步中,必須建立一個配置檔案。有一個網站接受手動輸入並自動生成該檔案 - https://computing.llnl.gov/linux/slurm/configurator.html。在這種情況下,只需要調整機器名稱。最重要的是,此檔案必須在所有客戶端和伺服器上完全相同。守護程式會自動啟動。使用 sinfo,您可以快速檢查一切是否正常。
手動
[edit | edit source]透過連結,您可以下載包含最新版本(2.5.3)的存檔。必須解壓縮該存檔。
$ wget http://schedmd.com/download/latest/slurm-2.5.3.tar.bz2 $ tar --bzip -x -f slurm*tar.bz2 此外,還必須呼叫配置。指示沒有選項就足夠了,但是,應確保伺服器和客戶端上的目錄相同,因為否則必須在每個客戶端上單獨安裝它。如果 gcc 和 make 可用,則安裝 SLURM。
$ ./configure --prefix=/opt/slurm_2.5.3 $ make $ make install 與上一節一樣,即使手動安裝,也必須建立配置檔案(請參閱上面的連結)。需要調整機器名稱。ReturnToService 選項應設定為 2。否則,在節點出現故障後,即使該節點再次可用,也不會再招募它。此外, 應該被選中。
Munge
Munge 是一種高度可擴充套件的身份驗證服務。它需要客戶端節點僅響應來自“真實”伺服器的請求,而不是來自任何伺服器的請求。為此,必須生成一個金鑰並將其複製到所有關聯的客戶端節點和伺服器。Munge 可以像往常一樣安裝。為了使身份驗證請求正確執行,所有機器上的時鐘必須同步。為此,ntp 服務就足夠了。相對誤差在 Munge 的容差範圍內。作為伺服器,SLURM 伺服器也應該被註冊。
安裝 Munge 後,將新增一個系統使用者,該使用者是在配置檔案中指定的(預設情況下為 slurm)。
$ sudo adduser --system slurm 目標是每個使用者都可以從其工作目錄提交作業並執行 SLURM 命令。這要求在 /etc/environment 中定製 PATH。新增以下路徑
/opt/slurm_2.5.3/sbin: 該路徑當然是指 SLURM 安裝的目錄,也可能有所不同。現在,使用者可以從任何目錄呼叫 SLURM 命令。但是,這不包括 sudo 命令,因為它們不從環境變數路徑讀取。為此,您使用以下方法
$ sudo $(which <SLURM-Command>) 使用 which,您可以獲取從修改後的環境變數讀取的命令的完整路徑。將此路徑傳遞給 sudo 命令。這可能很有用,因為在手動安裝後,兩個守護程式都必須手動啟動。在伺服器上執行 slurmctld,在客戶端機器上執行 slurmd。使用附加選項 -D -vvvv,您可以更詳細地檢視錯誤訊息(如果有錯誤)。-D 表示除錯,-v 表示 。連線的“v”越多,輸出越詳細。
排程程式
[edit | edit source]排程器是一種仲裁邏輯,用於控制作業的時間順序。本節介紹 SLURM 的內部排程器及其各種選項。還涵蓋了潛在的外部排程器。
在配置檔案中,可以定義三種方法 - 和
這種方法基於 FIFO 原則,無需進一步干預。
回填過程是一種高效分配的 FIFO。當作業需要當前空閒的資源,並且排在其他作業之後時,而這些作業的資源要求目前無法滿足,則會優先考慮“次要”作業。使用者定義的時間限制是相關的。

在圖形 [fig:schedul] 中,左側顯示了初始情況,其中有三個作業。作業 1 和作業 3 只需要一個節點,而作業 2 需要兩個節點。最初,兩個節點均未處於繁忙狀態。按照 FIFO 策略,作業 1 會被執行並阻塞一個節點。另外兩個作業必須在佇列中等待,儘管仍然有一個節點可用。按照回填策略,作業 3 將優先於作業 2,因為作業 3 所需的資源當前是空閒的。這裡非常重要的是規定的時間限制。作業 3 在作業 1 完成之前完成,因此如果兩個節點都可用,它不會阻止作業 2 的執行。如果作業 3 具有更長的超時時間,則不會優先考慮該作業。
叢集排程只在應用程式被接受時才有一種應用,即資源不會被獨佔分配(必須指定選項 –shared)。此時,它會在時間片之間切換。叢集排程會導致在儘可能相同的時間段內處理所屬程序,從而減少上下文切換。SchedulerTimeSlice 選項以秒為單位指定時間段的長度。如果多個程序爭用資源,則可以在此時間片內使用 builtin 或 backfill 排程。在舊版本(低於 2.1)中,分配遵循迴圈輪詢原則。
要使用叢集排程,至少要設定三個選項
PreemptMode = GANG
SchedulerTimeSlice = 10
SchedulerType = sched/builtin預設情況下,4 個程序能夠分配相同的資源。使用選項
Shared=FORCE:xy 可以定義數字 。
但是,SLURM 的排程功能並不侷限於這三種策略。藉助 選項,可以改進和調整每種策略,以滿足使用者和管理員的需求。策略是一種適用於任何作業、使用者或組或專案的規則。在大型系統中,當每個使用者都有自己的一組特定規則時,很快就會變得混亂。因此,SLURM 還透過 MySQL 或 PortgreSQL 支援資料庫連線。要使用資料庫,需要為 SLURM 顯式配置它們。在 SLURM 部分,需要設定某些選項,以便將策略規則應用於定義的組。詳細描述 - https://computing.llnl.gov/linux/slurm/accounting.html。
排程中的大多數選項都針對作業的優先順序。SLURM 使用一種複雜的計算方法來確定優先順序 - 。五個因素在計算中發揮作用 - (等待作業的等待時間)、(已分配資源和已使用資源之間的差值)、(已分配節點的數量)、(分配給節點組的一個因素)、(服務質量因素)。這些因素中的每一個也將獲得權重。這意味著某些因素被定義為更占主導地位。總的優先順序是加權因素的總和( 值介於 0.0 和 1.0 之間)
Job_priority =
(PriorityWeightAge) * (age_factor) +
(PriorityWeightFairshare) * (fair-share_factor) +
(PriorityWeightJobSize) * (job_size_factor) +
(PriorityWeightPartition) * (partition_factor) +
(PriorityWeightQOS) * (QOS_factor)可以在此處找到有關因素及其組成的詳細描述:https://computing.llnl.gov/linux/slurm/priority_multifactor.html。
特別有趣的是 QoS ()-因素。使用它的前提是,並且 PriorityWeightQOS 不為零。使用者可以為每個作業指定一個 QoS。這會影響排程、上下文跳轉和限制。允許的 QoS 在資料庫中以逗號分隔列表的形式指定。該列表中的 QoS 可以被相關組的使用者使用。預設值 normal 不會影響計算。但是,如果使用者知道他的作業特別短,他可以如下定義他的作業指令碼
#SBATCH --qos=short 此選項會提高作業的優先順序(如果配置正確),但在其 QoS 中描述的時間限制後會取消它。因此,人們應該現實地考慮。可用的 QoS 可以使用以下命令顯示
$ sacctmgr show qos QoS 的預設值如下所示:[3]
| QoS | 每個作業的牆上時間限制 | 每個作業的 CPU 時間限制 | QoS 的總節點限制 | 每個使用者的節點限制 |
| short | 1 小時 | 512 小時 | — | — |
| normal(Standard) | 4 小時 | 512 小時 | — | — |
| medium | 24 小時 | — | 32 | — |
| long | 5 天 | — | 32 | — |
| long_contrib | 5 天 | — | 32 | — |
| support | 5 天 | — | — | — |
這些值可以透過管理員在配置中更改。示例
MaxNodesPerJob=12 完整列表 - https://computing.llnl.gov/linux/slurm/resource_limits.html
外部排程程式
[edit | edit source]SLURM 與各種其他排程程式相容 - 這包括 Maui、Moab、LSF 和 Catalina。如果應該整合外部排程程式,則在配置檔案中應選擇 Builtin。
Maui
[edit | edit source]Maui 是 Adaptive Computing 提供的免費排程程式。[4]) Maui 的開發始於 2005 年。註冊後,該軟體包可以在製造商方面下載。該版本需要 Java 安裝。Maui 具有許多策略和排程選項,但現在由 SLURM 本身提供。
Moab
[edit | edit source]Moab 是 Maui 的繼任者。自 Maui 專案啟動以來,Adaptive Computing 已在 Moab 名稱下並根據商業許可開發了該軟體包。Moab 的擴充套件性比 Maui 更好。該產品還提供付費支援。
LSF
[edit | edit source]LSF - Load Sharing Facility - 是 IBM 的商業軟體。該產品不僅適用於 IBM 計算機,還適用於具有 Windows 或 Linux 作業系統的系統。
Catalina
Catalina 是一個持續多年的專案,目前有一個預釋出版本。它包含 Maui 的許多功能,支援網格計算,並允許在特定時間後保證可用節點。使用它需要 Python。
結論
[edit | edit source]該產品可以輕鬆使用。SLURM 的開發適應了當前的需求,因此它不僅可以用於小規模(少於 100 個核心),還可以用於領先的高可擴充套件架構。這得益於 SLURM 的可靠性和先進的容錯功能。SLURM 的排程程式選項幾乎滿足所有需求,不需要擴充套件。總的來說,SLURM 是一款非常棒的最新軟體。
參考文獻
[edit | edit source]- ↑ [foot:top500]http://www.top500.org/system/177999
- ↑ [foot:daemon] daemon - disk and execution monitor - On UNIX, a utility running in the background
- ↑ http://www.umbc.edu/hpcf/resources-tara/scheduling-policy.html
- ↑ http://www.adaptivecomputing.com/products/open-source/maui/