皆さん、こんにちは!
前回は最新バージョンのSlurm 25.05のの環境構築をご紹介しました。
Slurm 25.05をソースからインストール(Rocky Linux 9.6 マルチノード構成)
今回は、Slurm 25 をRocky9のマルチノード環境にインストールした際のリソース制限の動作、特にメモリ制限に焦点を当ててご紹介します。
HPC環境において、計算リソースの効率的な管理は非常に重要です。 特に、ジョブが利用するメモリ量を適切に制御することは、システムの安定性と利用効率を高める上で欠かせません。
具体的には、DefMemPerCPU の設定と cgroup.conf を使ったリソース制御について、実際の動作確認を通して解説していきます。
Slurmのメモリ制限の基本設定
まず、Slurmのリソース制限を行うための主要な設定ファイルである slurm.conf と cgroup.conf の内容を確認しましょう。
slurm.conf の設定
slurm.conf では、DefMemPerCPU パラメータを使用して、ジョブが要求するCPUコアあたりのデフォルトメモリ量を制限できます。
今回の設定例では、2GBに制限しています。
(設定例)
ProctrackType=proctrack/cgroup
TaskPlugin=task/affinity,task/cgroup
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory,CR_LLN
NodeName=node01 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=7680
DefMemPerCPU=2048
cgroup.conf の設定
cgroup.conf は、Linuxのcgroup機能を利用して、CPUコア、デバイス、RAM、スワップスペースなどのリソースを細かく制約するために使用されます。
ConstrainRAMSpace=yes の設定により、RAMスペースの制限が有効になります。
(設定例)
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes
CgroupPlugin=autodetect
メモリ使用テストプログラムの作成
リソース制限の動作を確認するため、指定されたメモリ量を確保し、一定時間保持するPythonスクリプト(memory_test.py)を作成します。
$ vi /home/life/memory_test.py
import time
import sys
import random
# コマンドライン引数でメモリ容量を指定
if len(sys.argv) != 2:
print("使い方: python3 memory_test.py <メモリ容量(GB)>")
sys.exit(1)
# 引数からメモリ容量を取得
try:
size_in_gb = int(sys.argv[1])
except ValueError:
print("エラー: メモリ容量は整数で指定してください。")
sys.exit(1)
# メモリを指定された容量だけ確保する
print(f"{size_in_gb}GBのメモリを確保しました。60秒メモリを保持します。")
data = [0] * (size_in_gb * 1024 * 1024 * 1024 // 8) # 指定サイズのリスト作成
# 60秒間待つ
sleep_time = 60
print(f"{sleep_time:.2f}秒間待機します。")
time.sleep(sleep_time)
print("待機時間が終了しました。プログラムを終了します。")
動作確認:メモリ制限の効果を検証
いよいよ、上記で作成したmemory_test.pyスクリプトをSlurmジョブとして実行し、メモリ制限の動作を確認していきます。
ケース1:2GB制限の中、1GBのメモリを使用するジョブ
まずは、設定されている2GBのデフォルトメモリ制限内で、1GBのメモリを要求するジョブを実行します。
- スクリプト作成 (1g-mem_ok.sh)
$ vi 1g-mem_ok.sh
#!/bin/bash
#SBATCH --job-name=1g-mem_ok
#SBATCH --partition=debug
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
#SBATCH --time=00:45:00
date
hostname
python3 /home/life/memory_test.py 1
date
- 実行
$ sbatch 1g-mem_ok.sh
- 結果確認 (.out ファイル)
$ cat 1g-mem_ok_12.out
2025年 7月 23日 水曜日 11:56:53 JST
node01
1GBのメモリを確保しました。60秒メモリを保持します。
60.00秒間待機します。
待機時間が終了しました。プログラムを終了します。
2025年 7月 23日 水曜日 11:57:54 JST
- sacct コマンドによるジョブ状態確認
$ sacct --format=JobID,JobName%15,User,Partition,State%15,ExitCode,Elapsed,Start,End
JobID JobName User Partition State ExitCode Elapsed Start End
------------ --------------- --------- ---------- --------------- -------- ---------- ------------------- -------------------
12 1g-mem_ok life debug COMPLETED 0:0 00:01:01 2025-07-23T11:56:53 2025-07-23T11:57:54
12.batch batch COMPLETED 0:0 00:01:01 2025-07-23T11:56:53 2025-07-23T11:57:54
- 結果: デフォルト制限の2GB内であったため、ジョブは正常に完了しました (State: COMPLETED, ExitCode: 0:0)。
ケース2:2GB制限の中、5GBのメモリを使用するジョブ
次に、デフォルト制限の2GBを超過する、5GBのメモリを要求するジョブを実行してみます。
- スクリプト作成 (5g-mem_ng.sh)
$ vi 5g-mem_ng.sh
#!/bin/bash
#SBATCH --job-name=5g-mem_ng
#SBATCH --partition=debug
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
#SBATCH --time=00:45:00
date
hostname
python3 /home/life/memory_test.py 5
date
- 実行
$ sbatch 5g-mem_ng.sh
- 結果確認 (.err ファイル)
$ cat 5g-mem_ng_13.err
/var/spool/slurmd/job00013/slurm_script: 11 行: 127330 強制終了 python3 /home/life/memory_test.py 5
[2025-07-23T11:59:35.285] error: Detected 1 oom_kill event in StepId=13.batch. Some of the step tasks have been OOM Killed.
- sacct コマンドによるジョブ状態確認
$ sacct --format=JobID,JobName%15,User,Partition,State%15,ExitCode,Elapsed,Start,End
JobID JobName User Partition State ExitCode Elapsed Start End
------------ --------------- --------- ---------- --------------- -------- ---------- ------------------- -------------------
13 5g-mem_ng life debug OUT_OF_MEMORY 0:125 00:00:01 2025-07-23T11:59:34 2025-07-23T11:59:35
13.batch batch OUT_OF_MEMORY 0:125 00:00:01 2025-07-23T11:59:34 2025-07-23T11:59:35
- 結果: 予期した通り、メモリ制限が働きエラーとなりました。OUT_OF_MEMORY の状態となり、OOM (Out Of Memory) Kill イベントが検出されています。
ケース3:2GB制限の中、6GBのメモリを要求し、5GBのメモリを使用するジョブ
最後に、デフォルト制限(2GB)を超えるメモリを要求するものの、#SBATCH --mem=6GB オプションを使って明示的に6GBのメモリを要求するジョブを実行し、その中で5GBを使用するシナリオです。
- スクリプト作成 (5g-mem_ok.sh)
$ vi 5g-mem_ok.sh
#!/bin/bash
#SBATCH --job-name=5g-mem_ok
#SBATCH --partition=debug
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
#SBATCH --time=00:45:00
#SBATCH --mem=6GB
date
hostname
python3 /home/life/memory_test.py 5
date
💡 ポイント: ここでは #SBATCH --mem=6GB を追加し、明示的に必要なメモリ量をSlurmに伝えています。
- 実行
$ sbatch 5g-mem_ok.sh
- 結果確認 (.out ファイル)
$ cat 5g-mem_ok_14.out
2025年 7月 23日 水曜日 12:01:34 JST
node01
5GBのメモリを確保しました。60秒メモリを保持します。
60.00秒間待機します。
待機時間が終了しました。プログラムを終了します。
2025年 7月 23日 水曜日 12:02:39 JST
- sacct コマンドによるジョブ状態確認
$ sacct --format=JobID,JobName%15,User,Partition,State%15,ExitCode,Elapsed,Start,End
JobID JobName User Partition State ExitCode Elapsed Start End
------------ --------------- --------- ---------- --------------- -------- ---------- ------------------- -------------------
14 5g-mem_ok life debug COMPLETED 0:0 00:01:05 2025-07-23T12:01:34 2025-07-23T12:02:39
14.batch batch COMPLETED 0:0 00:01:05 2025-07-23T12:01:34 2025-07-23T12:02:39
- 結果: 明示的にメモリを要求したため、ジョブは正常に完了しました。DefMemPerCPU で設定されたデフォルトの2GB制限は、--mem オプションによる明示的な要求がある場合はオーバーライドされることが分かります。
まとめ
今回は、Slurm 25 環境におけるメモリリソース制限の動作を詳細に確認しました。
slurm.conf の DefMemPerCPU と cgroup.conf の ConstrainRAMSpace=yes の組み合わせにより、デフォルトのメモリ制限が適用されること。
ジョブがデフォルト制限を超えるメモリを使用しようとすると、OOM (Out Of Memory) により強制終了されること。
しかし、sbatch コマンドで --mem オプションを明示的に指定することで、デフォルト制限を上書きし、より多くのメモリをジョブに割り当てられること。
これらの知識は、HPC環境の運用において、リソースの公平な利用とシステムの安定性を確保するために非常に役立ちます。
私たちライフマティックス株式会社では、今回ご紹介したSlurmのインストールや設定といった煩雑な作業を一切不要にする「Ready-to-Compute ワークステーション」を提供しています。また、導入後の運用サポートや、Slurmの保守サービスもご提供しています。
計算環境に関するご不明点やご要望がありましたら、ぜひお気軽にご相談くださいね!
このブログ記事が、皆さんの研究や開発を加速させる一助となれば幸いです!