デスクトップのSlurm、所有者の優先順位を指定する方法

デスクトップのSlurm、所有者の優先順位を指定する方法

簡単に言うと:Slurm クラスタでは、営業時間中に各所有者が利用可能で応答できるコンピュータがいくつか必要です。

質問:私は約10のノードで構成されている小さいながらも成長している異機種クラスターを管理していますが、その一部は専用ではありません。これは、レスポンシブコンピュータで作業することを好む同じネットワークの同僚が作業時間中に使用するデスクトップコンピュータです。しかし、夕方と週末には、一括操作のためにすべてのマシンといくつかの専用ノードを一緒にプールします。

最近HT CondorからSlurmに切り替えた理由は、クラスターに関係のないマシン所有者の通常の作業優先順位付けに加えて、あらゆる点で私たちの要件に適していたからです。 Condorでは、次の条件に基づいてタスクを一時停止、プリエンプション、または終了するようにノードを設定できます。

  • 時間帯または平日(平日の昼間に機械を使用)
  • キーボードアクティビティ(一部のユーザーは遅くまで作業できます)
  • クラスターで作成されたプロセス以外のプロセスでのCPUアクティビティ(ユーザーは自分のプロセスの一部を一晩実行することができ、これらのプロセスは干渉なしに実行する必要があります)

Slurmを使用するときにこれらの動作をエミュレートしたり、それを使用しているコンピュータの所有者を妨げない方法を探したいと思います。

追加情報:すべてのノードはUbuntu 18.04-19.04を使用し、バージョン18+のaptでslurmを見つけます。クラスタは、cgroupを使用して制限を適用し、以下のようにコアを消費可能なリソースとして使用するように構成されています。

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」を使用して[Service]でCpuWeight = 5を設定してリソース制御を追加してください。これは他のすべてのプロセスの優先順位を設定することになっていますが、とにかくその操作によってコンピュータが遅くなるため、期待どおりに機能しないようです。私はその作業がslurmdのサブプロセスであり、同じCpuWeightの影響を受けると思いました。これが実際に機能する場合は、問題全体を解決できます。

私が望むことを達成するには、より良い方法があるべきだと思います。助けてくれてありがとう。

ベストアンサー1

数日後、私は私の質問に答えることができました。振り返ってみると簡単だった。

感度: slurmdデーモンはslurmd -hslurmd -n 19デスクトップコンピュータでは、

  • 編集後に/etc/systemd/system/slurmd.service追加します。つまり、-n 19ExecStartExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS -n 19
  • systemdデーモンを再ロードしてください。systemctl daemon-reload
  • slurmdデーモンを再起動します。systemctl restart slurmd.service

メモリ予約: 一部のメモリはシステム用に予約できます。MemSpecLimit=8000ノード仕様を追加して所有者に8 GBを残しましたslurmd.conf。実際にメモリ制限を適用するには、いくつかの追加手順が必要です。

  • SelectTypeParameters=CR_Core_MemoryCoreとMemoryをで設定し、消費されるリソースとして選択しますslurmd.conf

  • TaskPlugin=task/affinity,task/cgroup設定でcgroupsタスクプラグインを追加しますslurmd.confConstrainRAMSpace=yescgroup.conf

  • GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"Ubuntuを使用しているので、次の行を追加してメモリとスワップcgroupを有効にします。/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

これには、新しい状態とその理由という2つのパラメータが必要です。

  • /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

  • 数時間後に状態を復元する手順を繰り返し、オプションでダウンタイムの1時間前に排水状態を繰り返します。

おすすめ記事