Lifematics Corporate Blog

Lifematics社のコーポレートブログへようこそ!

Slurm 25 でリソース制限を試してみよう!~Rocky9 MultiNode環境でのメモリ制限~

皆さん、こんにちは!

前回は最新バージョンの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のメモリを要求するジョブを実行します。

 $ 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のメモリを要求するジョブを実行してみます。

 $ 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を使用するシナリオです。

 $ 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の保守サービスもご提供しています。

計算環境に関するご不明点やご要望がありましたら、ぜひお気軽にご相談くださいね!

このブログ記事が、皆さんの研究や開発を加速させる一助となれば幸いです!