AWS ParallelCluster のクラスター間でジョブ履歴を共有する方法
はじめに
AWS ParallelCluster で Slurm アカウンティングを利用する際、クラスターが変わると過去のジョブ履歴がsacct
コマンドで参照できなくなることがあります。この問題は Slurm のコンフィグで指定するデータベース名の設定が関係しています。本記事では、複数のクラスター間でジョブ履歴を共有する方法について解説します。
問題の背景
ParallelCluster を運用していると、ParallelCluster のバージョンアップデートによりクラスターの再作成が必要になります。新しいクラスターへ移行しても同じ DB サーバーを継続して利用することがあります。しかし、新しいクラスターからは、以前のクラスターで実行した過去のジョブ履歴が見られなくなります。
具体的には、sacct
コマンドを実行しても、以前のクラスターで実行したジョブの履歴が表示されません。
原因
ParallelCluster がクラスターごとに異なるデータベース名を作成することに起因します。
ParallelCluster の設定では、Slurm のアカウンティングデータベースとして、デフォルトでクラスター名がデータベース名(StorageLoc)として使用されます。そのため、クラスター名が変わると、同じ DB サーバーへ接続していても新しいデータベース名として作成されます。過去のジョブ履歴が別のデータベース名で保存されているため参照できません。
解決策
すべてのクラスターで同じデータベース名を使用するよう設定します。ParallelCluster の設定ファイルで、Slurm アカウンティングのデータベース名を明示的に指定することで、クラスターが変わっても影響がなくなります。
設定方法
ParallelCluster の設定ファイルで、以下のようにDatabaseName
でデータベース名を指定します。
Scheduling:
Scheduler: slurm
SlurmSettings:
ScaledownIdletime: 10
Database:
Uri: devio.cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306
UserName: admin
PasswordSecretArn: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:devio-hoge
DatabaseName: "slurm_acct_db" # データベース名の設定は任意
この設定により、/opt/slurm/etc/slurm_parallelcluster_slurmdbd.conf
ファイルのStorageLoc
パラメータに同じ値が設定されます。
動作確認
設定が正しく適用されたか確認するため、複数のクラスターでジョブを実行して履歴を確認します。
ジョブを実行した後、sacct
コマンドを使って履歴を確認します。デフォルトでは現在のクラスターのジョブのみ表示されます。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
4 cluster2 test pcdefault 1 RUNNING 0:0
すべてのクラスターのジョブ履歴を表示するには、-L
オプションを使用します。これにより、他のクラスターで実行されたジョブも含めて全ての履歴が表示されます。
$ sacct -L
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
3 cluster1 test pcdefault 1 RUNNING 0:0
4 cluster2 test pcdefault 1 RUNNING 0:0
クラスター指定での確認
特定のクラスターのジョブ履歴のみを確認したい場合は、--cluster
オプションを使用します。
# cluster1のジョブのみ表示
$ sacct --cluster v1
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
3 cluster1 test pcdefault 1 RUNNING 0:0
# cluster2のジョブのみ表示
$ sacct --cluster v2
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
4 cluster2 test pcdefault 1 RUNNING 0:0
この結果から、同じデータベース名を設定することで、異なるクラスターのジョブ履歴を一元的に管理・確認できることが確認できます。これにより、クラスターの世代が変わっても過去のジョブ履歴を参照可能です。
少し深堀り
Slurm のデータベース設定
Slurm の公式ドキュメントによると、StorageLoc
パラメータはアカウンティングレコードが書き込まれるデータベースの名前を指定します。デフォルトは"slurm_acct_db"です。
StorageLoc
Specify the name of the database as the location where accounting records are written.
Defaults to "slurm_acct_db".
引用: https://slurm.schedmd.com/slurmdbd.conf.html#OPT_StorageLoc
ParallelCluster の仕様
ParallelCluster は、各クラスターが独自の Slurm データベースを持つようにslurmdbd
を設定します。同じ DB サーバーを複数のクラスターで使用できますが、デフォルトではクラスターごとに別々のデータベース名が作成されます。
AWS ParallelCluster のドキュメントには以下のように記載されています。
AWS ParallelCluster configures slurmdbd to ensure that a cluster has its own Slurm database on the database server.
The same database server can be used across multiple clusters, but each cluster has its own separate database.
AWS ParallelCluster uses the cluster name to define the name for the database in the slurmdbd configuration file StorageLoc parameter.
引用: https://docs.aws.amazon.com/parallelcluster/latest/ug/slurm-accounting-v3.html
設定ファイルの例
クラスターのコンフィグで指定した設定値は、ヘッドノードの以下の設定ファイルに書き込まれます。
# slurm_parallelcluster_slurmdbd.conf is managed by the pcluster processes.
# Do not modify.
# Please add user-specific slurmdbd configuration options in slurmdbd.conf
DbdHost=ip-10-0-0-245
StorageHost=devio.ap-northeast-1.rds.amazonaws.com
StoragePort=3306
StorageLoc=slurm_acct_db
StorageUser=admin
StoragePass=hoge
クラスターの設定ファイルのDabaseName
は、クラスター作成後に変更可能なアップデートポリシーです。
参考: Scheduling section - AWS ParallelCluster
まとめ
AWS ParallelCluster の Slurm アカウンティングでクラスター移行後も過去のジョブ履歴を確認するには以下の点がポイントです。
- 複数のクラスターで同じジョブ履歴を参照したい場合は、共通のデータベース名を設定する
- ParallelCluster 設定ファイルでデータベース名を明示的に指定する
この設定によりクラスターの世代が変わっても、sacct
コマンドから過去のジョブ履歴を一元的に確認できるようになります。
おわりに
お客様から質問があり調査した記録をまとめました。複数クラスター間でのジョブ履歴共有に関するベストプラクティスを整理し、解説ブログを書く予定です。