Linux

台式電腦上的slurm,如何優先考慮所有者

  • August 11, 2019

**簡而言之:**在 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 19ExecStart,即ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS -n 19
  • 重新載入 systemd 守護程序systemctl daemon-reload
  • 重新啟動 slurmd 守護程序,systemctl restart slurmd.service

記憶體預留: 部分記憶體可以預留給系統。我通過MemSpecLimit=8000slurmd.conf. 要實際執行記憶體限制,還有一些額外的步驟:

  • SelectTypeParameters=CR_Core_Memory通過在 中設置,選擇 Core 和 Memory 作為可消耗資源slurmd.conf
  • 通過設置添加 cgroups 任務外掛TaskPlugin=task/affinity,task/cgroupslurmd.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
  • 在下班後重複恢復狀態的步驟,並在下班前一小時左右重複排水狀態。

引用自:https://unix.stackexchange.com/questions/533727