RHEL 9 EC2環境でSlurm Job Schedulerを検証してみた。

RHEL 9 EC2環境でSlurm Job Schedulerを検証してみた。

RHEL 9 EC2環境でSlurm Job Schedulerを検証してみました。
2026.07.17

こんにちは、クラスメソッドのキム・ジェウク(Kim Jaewook)です。

今回は、RHEL 9 EC2環境でSlurm Job Schedulerを検証してみました。

元々は、LSF(Load Sharing Facility) Job Schedulerの検証を行う予定でしたが、LSFはIBMが提供する商用ソフトウェアであるため、検証用のテスト環境を構築するにはいくつかの制約がありました。

そのため、LSFと同様の機能を持つオープンソースのJob SchedulerであるSlurmを利用し、Job Schedulingの動作を検証してみました。

Job Schedulerは、CADシミュレーションのように大量の計算リソースを必要とする処理を複数のユーザーが同時に実行する環境において、サーバーリソースを効率的に管理・割り当てる役割を担います。

例えば、複数のユーザーが同時にシミュレーションの実行を要求した場合、Job Schedulerは、サーバーのCPUやメモリなどのリソース使用状況を確認し、ジョブの実行順序や各ジョブに割り当てるリソース量を決定します。

ユーザーA:シミュレーション実行
ユーザーB:シミュレーション実行  →  Slurm / LSF  →  サーバーリソースの使用状況を確認
ユーザーC:シミュレーション実行  →  実行待ちキューへ登録 → リソースを割り当て後に実行

LSF vs Slurm

項目 LSF Slurm
コスト 有料(IBM) 無料(オープンソース)
主要コマンド bsub, bjobs sbatch, srun, squeue
ジョブ管理の概念 同一 同一
主な使用分野 HPC、EDA、研究環境 HPC、研究環境、クラスタ環境

LSFとSlurmでは、利用するコマンドや細かい機能に違いがありますが、ユーザーがジョブを実行し、スケジューラーがリソースを管理した上でジョブを実行するという基本的な動作は同じです。

やりたいこと

今回のブログでは、次を実装します。

  • マスターからsrun --nodes=1 --ntasks=1 hostnameを実行
  • slurmctld がワーカーノードの状態(Idle)を確認
  • slurmctld がワーカーノード上の slurmd に「hostnameを実行」と指示
  • slurmdhostname コマンドを実行
  • 実行結果(ip-xx-x-xxx-xxx...)をマスターノードへ返却

image1

各サーバーの役割は以下の通りです。

  • slurmctld(マスターノード)
    • クラスタ全体の管理
    • ジョブキューの管理(ジョブの実行順序や実行ノードを決定)
    • ワーカーノードの状態監視
    • 実際のジョブ実行は行わない
  • slurmd(ワーカーノード)
    • マスターノードからの指示を受け、実際のジョブを実行するデーモン
    • 常にバックグラウンドで待機し、マスターノードからジョブ実行指示を受けると処理を開始する

セキュリティグループ設定

まず、マスターノードのセキュリティグループのインバウンドルールを設定します。

マスターSGインバウンドルール

ポート プロトコル ソース 用途
6817 TCP ワーカーSG Slurm Controller
6818 TCP ワーカーSG Slurm Daemon
6819 TCP ワーカーSG Slurm DBD
1024-65535 TCP ワーカーSG IO通信(Ephemeral Port)

※ 1024-65535の範囲は、SlurmがIO通信に一時的なポート(Ephemeral Port)を利用するため必要になります。このルールが設定されていない場合、ジョブ実行時にタイムアウトが発生します。

続いて、ワーカーノードのセキュリティグループのインバウンドルールを設定します。

ワーカーSGインバウンドルール

ポート プロトコル ソース 用途
6817 TCP マスターSG Slurm Controller
6818 TCP マスターSG Slurm Daemon

Step 1. マスターノードの設定

SSM Session Managerでマスターノードに接続した後、設定を進めます。

EPELリポジトリ追加及びSlurmインストール

sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install -y slurm slurm-slurmctld slurm-slurmd munge

Mungeキー作成及び起動

Mungeは、マスターノードとワーカーノード間の通信認証に使用するツールです。

sudo /usr/sbin/create-munge-key
sudo systemctl enable munge
sudo systemctl start munge
sudo systemctl status munge

slurmユーザー作成

Slurmデーモンを実行するため、システムユーザーを作成します。

sudo useradd -r -s /sbin/nologin slurm

Slurm設定ファイル作成

slurm.confは、ジョブを実行するノードや使用するリソースなど、Slurmクラスタの基本設定を定義するファイルです。

  • マスターノードの指定
  • ワーカーノードの指定
  • 使用可能なCPU数
  • 通信ポート番号
sudo tee /etc/slurm/slurm.conf << 'EOF'
ClusterName=test-cluster
SlurmctldHost=ip-10-0-xxx-xxx.ap-northeast-1.compute.internal

SlurmUser=slurm
SlurmctldPort=6817
SlurmdPort=6818

AuthType=auth/munge
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd

SchedulerType=sched/backfill
SelectType=select/cons_tres

SlurmctldLogFile=/var/log/slurmctld.log
SlurmdLogFile=/var/log/slurm.log

NodeName=ip-10-0-yyy-yyy.ap-northeast-1.compute.internal CPUs=2 State=UNKNOWN
PartitionName=debug Nodes=ip-10-0-yyy-yyy.ap-northeast-1.compute.internal Default=YES MaxTime=INFINITE State=UP
EOF

ディレクトリ作成及びslurmctld起動

sudo mkdir -p /var/spool/slurmctld
sudo chown slurm:slurm /var/spool/slurmctld
sudo touch /var/log/slurmctld.log
sudo chown slurm:slurm /var/log/slurmctld.log
sudo systemctl enable slurmctld
sudo systemctl start slurmctld
sudo systemctl status slurmctld

実行結果

 slurmctld.service - Slurm controller daemon
     Active: active (running)
   Main PID: 17575 (slurmctld)

Step 2. Mungeをワーカーノードにコピー

マスターノードとワーカーノードが同じMungeキーを共有することで、通信認証が可能になります。

マスターでキーを確認

sudo cat /etc/munge/munge.key | base64

ワーカーにキーをコピー

ワーカーノードにSSMで接続した後、以下のコマンドを実行します。

sudo bash -c 'echo "マスターからコピーした_base64値" | base64 -d > /etc/munge/munge.key'
sudo chmod 400 /etc/munge/munge.key
sudo chown munge:munge /etc/munge/munge.key

Step 3. ワーカーノードの設定

EPELリポジトリ追加及びSlurmインストール

sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install -y slurm slurm-slurmd munge

slurmユーザー作成

sudo useradd -r -s /sbin/nologin slurm

Munge起動

sudo systemctl enable munge
sudo systemctl start munge
sudo systemctl status munge

Slurm設定ファイル作成(マスターノードと同じ設定)

sudo tee /etc/slurm/slurm.conf << 'EOF'
ClusterName=test-cluster
SlurmctldHost=ip-10-0-xxx-xxx.ap-northeast-1.compute.internal

SlurmUser=slurm
SlurmctldPort=6817
SlurmdPort=6818

AuthType=auth/munge
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd

SchedulerType=sched/backfill
SelectType=select/cons_tres

SlurmctldLogFile=/var/log/slurmctld.log
SlurmdLogFile=/var/log/slurmd.log

NodeName=ip-10-0-yyy-yyy.ap-northeast-1.compute.internal CPUs=2 State=UNKNOWN
PartitionName=debug Nodes=ip-10-0-yyy-yyy.ap-northeast-1.compute.internal Default=YES MaxTime=INFINITE State=UP
EOF

ディレクトリ作成及びslurmd起動

sudo mkdir -p /var/spool/slurmd
sudo chown slurm:slurm /var/spool/slurmd
sudo touch /var/log/slurmd.log
sudo chown slurm:slurm /var/log/slurmd.log
sudo systemctl enable slurmd
sudo systemctl start slurmd
sudo systemctl status slurmd

実行結果

 slurmd.service - Slurm node daemon
     Active: active (running)
   Main PID: 17584 (slurmd)
   slurmd: slurmd version 22.05.9 started
   slurmd: CPUs=2 Boards=1 Sockets=2 Cores=1 Threads=1 Memory=1713

Step 4. 動作確認

マスターノードから動作確認を行います。

ノード状態確認

sinfo

実行結果

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      1   idle ip-10-0-yyy-yyy.ap-northeast-1.compute.internal

ワーカーノードがidle状態で、正常に接続されていることを確認できます。

ジョブ実行テスト

srun --nodes=1 --ntasks=1 hostname

実行結果

ip-10-0-yyy-yyy.ap-northeast-1.compute.internal

マスターノードからジョブを実行すると、ワーカーノード上で処理が実行され、結果が返却されることを確認できます。

最後に

今回の検証では、RHEL 9ベースのEC2環境でSlurmクラスタを構築し、マスターノードから投入したジョブがワーカーノード上で実行される一連の流れを確認しました。

今回は単純なhostnameコマンドの実行でテストしましたが、実際のHPCやEDA環境では、この部分にCADシミュレーション実行スクリプトや大規模計算処理を配置することで、同じ仕組みで処理を実行できます。

全体の動作フローは以下の通りです。

ユーザー

ジョブ投入(srun / sbatch)

slurmctld(マスターノード)

リソース状態確認及び実行ノード決定

slurmd(ワーカーノード)

ジョブ実行

結果返却

今回のテストを通じて、LSFのような商用ジョブスケジューラが提供する基本的な動作構造を、Slurm環境でも確認することができました。

もちろん、実際の運用環境では、複数のワーカーノード構成、GPUリソース管理、ユーザーごとのキュー設定、ジョブ優先度管理など、追加の設定が必要になります。

しかし、基本的な「ジョブ投入 → リソース割り当て → ジョブ実行 → 結果返却」という処理フローは、今回構築した検証環境と同じ仕組みで動作します。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事