台式電腦上的slurm,如何優先考慮所有者
**簡而言之:**在 Slurm 集群上,我需要一些電腦在工作時間可用並響應它們各自的所有者。
**問題:**我管理一個包含大約 10 個節點的小型(但不斷增長的)異構集群,其中一些節點不是專用的。這些是同事在工作時間在同一網路上使用的台式電腦,他們更願意在響應式電腦上工作。然而,在晚上和周末,我們將所有電腦和一些專用節點集中在一起進行批處理作業。
我最近從 HT Condor 切換到 Slurm,因為它在所有方面都更符合我們的需求,除了一個方面:優先考慮機器所有者與集群無關的正常工作。在 Condor 上,節點可以配置為暫停、搶占或終止作業,具體取決於標準,例如
- 一天中的時間或工作日(機器在工作日的白天使用)
- 鍵盤活動(某些使用者可能工作到很晚)
- 來自集群產生的程序以外的程序的 CPU 活動(使用者可能會讓他們自己的一些程序在一夜之間執行,這些程序應該在不受干擾的情況下執行)
我想在使用 Slurm 時模仿任何這些行為,或者想辦法不打擾使用電腦的所有者。
**附加資訊:**所有節點都使用 Ubuntu 18.04-19.04,並在 apt 中找到 slurm,即版本 18+。集群使用 cgroups 執行限制,並配置為使用核心作為可消耗資源,如
SelectType=select/cons_res SelectTypeParameters=CR_Core
我在大多數台式電腦上都沒有 sudo 權限,所以我需要一個“設置並忘記”解決方案,有一次我配置我的同事 PC 時,或者我可以從我有 sudo 的頭節點做一些事情。
**嘗試:**我已經考慮了這些選項,但仍然不滿意:
對於一天中的時間/工作日,使用 crontab 或 systemd 和 slurmd.service 中的 OnCalendar 事件,以:
- 啟動/停止守護程序。這可能是最簡單的方法,但會以不干淨的方式殺死工作。
- 啟動一個腳本,使用 scontrol 將節點狀態設置為 down/resume/drain/etc,可能來自頭節點。我沒有嘗試過這個,因為我無法弄清楚如何在 scontrol 的互動模式之外執行此操作。
為了響應性,使用“systemd edit slurmd.service”通過在下設置CpuWeight=5來添加資源控制$$ Service $$. 這應該優先考慮其他所有過程,但似乎沒有按我的預期工作,因為這些工作無論如何都會使電腦變得遲緩。我認為工作將是 slurmd 的子程序,並且受相同的 CpuWeight 約束。如果這確實運作良好,它可以解決整個問題。
我覺得應該有更好的方法來實現我想要的。任何幫助表示讚賞。
幾天后,我設法回答了我自己的問題。事後看來,這很簡單。
響應性: slurmd 守護程序可以用命令行參數啟動,用
slurmd -h
. 特別是,slurmd -n 19
為守護程序及其所有子程序設置最高的 nice-value(因此是最低的優先級)。在台式電腦上,我只是
- 編輯
/etc/systemd/system/slurmd.service
附加-n 19
到ExecStart
,即ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS -n 19
- 重新載入 systemd 守護程序
systemctl daemon-reload
- 重新啟動 slurmd 守護程序,
systemctl restart slurmd.service
記憶體預留: 部分記憶體可以預留給系統。我通過
MemSpecLimit=8000
在slurmd.conf
. 要實際執行記憶體限制,還有一些額外的步驟:
SelectTypeParameters=CR_Core_Memory
通過在 中設置,選擇 Core 和 Memory 作為可消耗資源slurmd.conf
。- 通過設置添加 cgroups 任務外掛
TaskPlugin=task/affinity,task/cgroup
,slurmd.conf
然後設置ConstrainRAMSpace=yes
.cgroup.conf
- 因為我們在 Ubuntu 上,所以通過添加以下行
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
來啟用記憶體和交換 cgroups/etc/default/grub
工作日的工作時間 我的一些同事希望在工作時間實現零分心。這很容易
scontrol
從頭節點開始,在工作時間將其節點狀態設置為“關閉”,並在工作時間後“恢復”。我使用 systemd 計時器自動執行此操作:
- 首先,製作一個可執行腳本,使用以下命令更新相關桌面的節點狀態
scontrol
:#!/bin/bash # slurm-update.sh - Updates the state on nodes belonging to the work-hour desktops partition. systemctl start slurmd for node in $(sinfo -h --partition=WHdesktops --format="%n"); do state=$(sinfo -h --node=$node --format="%T") echo "Setting node $node to state=$1 with reason=$2" scontrol update NodeName=$node state=$1 reason="$2" || echo "State on $node is already $(sinfo -h --node=$node --format=\"%T\")" done
這需要兩個參數,新狀態和它的原因。
- 在目錄中創建一對服務/計時器文件,
/etc/systemd/system
以在特定時間執行上述腳本。每個要設置的狀態製作一對(例如,我製作了 3 對,用於放下、排水和恢復)。設置“向下”的對看起來像這樣# /etc/systemd/system/slurm-down.service: [Unit] Description=Shut down all SLURM desktop nodes [Service] Type=simple ExecStart=/bin/bash /mnt/nfs/slurm_fs/systemd/slurm-update.sh down afterhours StandardError=journal
和
# /etc/systemd/system/slurm-down.timer: [Unit] Description=Timer for shutting down slurm on desktop nodes on weekdays [Timer] Unit=slurm-down.service OnBootSec=10min # Run hourly on weekdays between 8:05 to 18:05 OnCalendar=Mon..Fri *-*-* 8..18:05:00 [Install] WantedBy=multi-user.target
- 重新載入守護程序,
systemctl daemon-reload
然後僅啟用和啟動計時器,而不是服務:systemctl enable --now slurm-down.timer
。- 在下班後重複恢復狀態的步驟,並在下班前一小時左右重複排水狀態。