KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

SLURMのプロセスIDの取得

登録日 :2025/03/07 20:39
カテゴリ :SLURM

SLURMで実行中のジョブ(特に複数ノードでの並列計算)に関連するプロセスID(PID)を取得することは可能です。SLURMはジョブIDとプロセス情報を紐づけるためのコマンドや機能を提供しています。ただし、いくつかの制約があるため、それを理解した上で適切な方法を選択する必要があります。

方法 1: scontrol listpids コマンドを使用

listpidsは、指定したジョブIDまたはジョブステップIDに関連付けられたプロセスID(PID)のリストを取得するためのslurmctldコマンドです。

scontrol listpids <job_id>

出力内容: 指定されたジョブIDに関連付けられたすべてのプロセスIDが表示されます。

制約: このコマンドは、現在のノードで実行されているプロセスに対してのみ機能します。また、SLURMが管理しているプロセス(およびその子プロセス)のみが対象です。

※scontrol listpidsはSLURM 23.02以降で利用可能

方法 2: SLURM環境変数とpsコマンドを組み合わせる

SLURMはジョブ実行中にいくつかの環境変数を設定します。それらを利用して、ジョブに関連するプロセスをフィルタリングできます。

使用例
以下は、ジョブIDに基づいてプロセス情報を取得する例です:

ps aux | grep $SLURM_JOB_ID | grep -v grep

説明:

$SLURM_JOB_IDは現在のジョブIDを示します。

grep -v grepは検索結果から自身のgrepコマンドを除外します。

制約: この方法では、コマンドライン引数や環境変数にジョブIDが含まれていないプロセスは検出できません。

方法 3: ノードごとのPID収集 (srun + ps)
複数ノードにまたがる並列計算の場合、各ノードで動作中のプロセス情報を収集する必要があります。これにはsrunを使用して各ノードでpsコマンドを実行します。

使用例

srun -N <num_nodes> bash -c 'ps -u $USER -o pid,cmd | grep $SLURM_JOB_ID'

説明:

-N で対象ノード数を指定します。

$USERは現在のユーザー名です。

grep $SLURM_JOB_IDでジョブIDに関連付けられたプロセスのみを抽出します。

結果: 各ノード上で動作中のすべての関連プロセスがリストアップされます。

方法 4: sstatコマンドでジョブステータスとPID情報を確認

sstatコマンドは、実行中のジョブステータスやリソース使用状況(CPU時間、メモリ使用量など)とともにPID情報も取得できます。

使用例

sstat -j <job_id> --format=JobID,NodeList,AveRSS,AveCPU,MaxRSS,MaxVMSize,MaxDiskWrite

説明:

--formatオプションで必要な情報(例えば、PID)を指定できます。

ノードごとの詳細なリソース使用状況も確認可能です。

制約: PIDそのものではなく、リソース使用状況が主な出力となるため、PID取得には補助的な役割となります。

注意点
ProctrackType設定依存:
SLURMクラスタの設定によっては、すべてのプロセスが正確に追跡されない場合があります。特に、ProctrackType=pgidなどの場合、一部の子プロセスが追跡から外れる可能性があります。この場合、カスタムEpilogスクリプトや外部ツールで補完する必要があります。

非SLURM管理プロセス:
SLURMが直接生成したプロセス以外(例えば、手動で起動された子プロセス)は追跡対象外になる場合があります。その場合も手動でPID収集ロジックを追加する必要があります。

結論
特定のジョブIDに紐づくPID情報は、以下の方法で取得可能です:

単一ノードの場合: scontrol listpids

複数ノードの場合: srunとpsコマンドの組み合わせ

クラスタ設定やジョブ構成によって制約が異なるため、自身の環境に応じた方法を選択してください。