
AWS PCS ジョブの実行履歴を保存できる Slurm アカウンティングをサポートした Slurm 24.11 バージョンがリリースされました
AWS Parallel Computing Service (PCS) が マネージドサービスの Slurm アカウンティングをサポートしたバージョンがリリースされました。Slurm アカウンティングを利用すると、ジョブの履歴保存や、きめ細かいアクセス制御が可能になります。
マネージドサービスの Slurm アカウンティングの概要
通常は Slurm の履歴保存先として、MySQL 互換のデータベースが必要です。マネージドサービスの AWS PCS では、そのデータベース部分の作成、管理もマネージドサービスとして提供しています。
Slurm アカウンティングを有効にすることで、以下の機能が利用可能になります。
- クラスター使用状況のモニタリング
- リソース制限の適用
- 特定のキューやコンピュートノードグループへのきめ細かいアクセス制御
AWS PCS は Slurm バージョン 24.11 以降でアカウンティング機能をサポートしています。また、データベースは AWS が所有するアカウントで作成・管理されます。 Slurm のデータベース接続情報の設定ファイル(slurmdbd.conf
)へのアクセス権は利用者には与えられません。
料金体系
Slurm アカウンティング機能を有効にすると、2 つの追加料金が発生します。
- アカウンティング使用料:選択したコントローラーサイズによって変わる 1 時間あたりの料金
- アカウンティングストレージ料:GB-月単位で請求されるストレージ料金
例えば、Small サイズのコントローラーを選択し、平均 10GB のデータを保存する場合、1 ヶ月の利用費は以下のようになります。
- アカウンティング使用料:$0.23/時間 × 24 時間/日 × 30 日/月 = $165.6
- アカウンティングストレージ料:$1.07/GB/月 × 10GB = $10.7
※ AWS PCS の基本料金(コントローラー料金とノード管理料金)に加えて発生する費用です。
最新の料金は公式サイトを確認してください。
HPC Workload Service – AWS Parallel Computing Service Pricing – AWS
アカウンティングの設定オプション
AWS PCS のアカウンティング機能には、以下の設定オプションがあります。
データの保持期間
すべてのアカウンティングレコードタイプ(ジョブ、イベント、予約、ステップ、停止、トランザクション、使用状況データ)の保持期間を日数で指定します。例えば、30 を指定すると、AWS PCS はアカウンティングレコードを 30 日間保持します。クラスター作成時に値を設定でき、値を指定しない場合は無期限に保持できます。
アカウンティングポリシーの適用
ジョブ送信ルール、リソース制限、およびアカウンティングポリシーをどの程度厳密に適用するかを決定します。この設定はクラスターの slurm.conf
ファイルの AccountingStorageEnforce
パラメータに対応しています。詳細は Slurm のドキュメントをご確認ください。
Slurm Workload Manager - slurm.conf
オプション項目のため選択しないことも可能です。
試してみた
クラスター作成時に Slurm アカウンティングを有効化
最新バージョンの Slurm 24.11 を選択すると、スケジューラーの設定から Slurm アカウンティングの設定ができます。
- クラスターの作成ページで、Slurm バージョン 24.11 以降を選択します
- スケジューラー設定セクションで、アカウンティングを有効にします
- 必要に応じて保持期間(日数) を設定します
- アカウンティングポリシーの適用 ドロップダウンリストから、必要なオプションを選択します
今回はアカウンティングポリシーを未設定で PCS クラスターを作成しました。
ログインノードへログインして確認
sacct
コマンド使用可能となっています。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
ジョブをサブミットしました。sacct
コマンドでも確認可能になっています。
$ sbatch -p queue-1 test.sh
Submitted batch job 1
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1 test.sh queue-1 1 RUNNING 0:0
最初にサブミットしたジョブは完了して、2 つ目のジョブを処理中であることがわかります。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1 test.sh queue-1 1 COMPLETED 0:0
1.batch batch 1 COMPLETED 0:0
1.extern extern 1 COMPLETED 0:0
2 test.sh queue-1 1 RUNNING 0:0
AWS 管理のデータベースを追う
データベースは AWS のサービスアカウントで起動しているため、利用者側から存在を確認できません。Slurm の設定情報からなにかわからないか調べてみました。
sacctmgr show configuration の実行結果
$ sacctmgr show configuration
Configuration data as of 2025-05-16T07:17:07
AccountingStorageBackupHost = (null)
AccountingStorageHost = 10.0.0.99
AccountingStorageParameters = (null)
AccountingStoragePass = (null)
AccountingStoragePort = 6819
AccountingStorageType = accounting_storage/slurmdbd
AccountingStorageUser = N/A
AuthType = auth/slurm
MessageTimeout = 210 sec
PluginDir = /opt/aws/pcs/scheduler/slurm-24.11/lib/slurm
PrivateData = none
SlurmUserId = slurm(401)
SLURM_CONF = /etc/slurm/slurm.conf
SLURM_VERSION = 24.11.5
TCPTimeout = 2 sec
TrackWCKey = No
SlurmDBD configuration:
AllowNoDefAcct = no
ArchiveDir = /tmp
ArchiveEvents = no
ArchiveJobs = no
ArchiveResvs = no
ArchiveScript = (null)
ArchiveSteps = no
ArchiveSuspend = no
ArchiveTXN = no
ArchiveUsage = no
AuthAltTypes = (null)
AuthAltParameters = (null)
AuthInfo = (null)
AuthType = auth/slurm
BOOT_TIME = 2025-05-16T05:34:13
CommitDelay = no
CommunicationParameters = (null)
DbdAddr = slurmdbd-primary
DbdBackupHost = (null)
DbdHost = slurmdbd-primary
DbdPort = 6819
DebugFlags = AuditRPCs
DebugLevel = verbose
DebugLevelSyslog = (null)
DefaultQOS = (null)
DisableCoordDBD = no
HashPlugin = hash/sha3
LogFile = /dev/null
MaxQueryTimeRange = UNLIMITED
MessageTimeout = 10 secs
Parameters = DisableArchiveCommands
PidFile = /var/run/slurmdbd.pid
PluginDir = /opt/slurm/lib/slurm
PrivateData = none
PurgeEventAfter = 180 days
PurgeJobAfter = 180 days
PurgeResvAfter = 180 days
PurgeStepAfter = 180 days
PurgeSuspendAfter = 180 days
PurgeTXNAfter = 180 days
PurgeUsageAfter = 180 days
SLURMDBD_CONF = /etc/slurm/slurmdbd.conf
SLURMDBD_VERSION = 24.11.5
SlurmUser = slurm(401)
StorageAuthTokenPlugin = script
StorageAuthTokenParams = script_path=/etc/slurm/scripts/db_token_gen.sh,token_validity_seconds=300
StorageBackupHost = (null)
StorageHost = pcs-n6bosx3ar3-123456798012.cluster-cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
StorageLoc = slurm_acct_db
StorageParameters = SSL_CAPATH=/etc/pki/ca-trust/extracted/pem/directory-hash/
StoragePort = 3306
StorageType = accounting_storage/mysql
StorageUser = slurm
TCPTimeout = 2 secs
TLSParameters = (null)
TLSType = tls/none
TrackWCKey = no
TrackSlurmctldDown = no
scontrol show config の実行結果
$ scontrol show config
Configuration data as of 2025-05-16T07:12:42
AccountingStorageBackupHost = (null)
AccountingStorageEnforce = none
AccountingStorageHost = 10.0.0.99
AccountingStorageExternalHost = (null)
AccountingStorageParameters = (null)
AccountingStoragePort = 6819
AccountingStorageTRES = cpu,mem,energy,node,billing,fs/disk,vmem,pages
AccountingStorageType = accounting_storage/slurmdbd
AccountingStorageUser = N/A
AccountingStoreFlags = (null)
AcctGatherEnergyType = (null)
AcctGatherFilesystemType = (null)
AcctGatherInterconnectType = (null)
AcctGatherNodeFreq = 0 sec
AcctGatherProfileType = (null)
AllowSpecResourcesUsage = no
AuthAltTypes = (null)
AuthAltParameters = (null)
AuthInfo = use_client_ids,cred_expire=70
AuthType = auth/slurm
BatchStartTimeout = 10 sec
BcastExclude = /lib,/usr/lib,/lib64,/usr/lib64
BcastParameters = (null)
BOOT_TIME = 2025-05-16T06:03:42
BurstBufferType = (null)
CertmgrParameters = (null)
CertmgrType = (null)
CliFilterPlugins = (null)
ClusterName = slurm2411-cluster
CommunicationParameters = NoCtldInAddrAny
CompleteWait = 0 sec
CpuFreqDef = Unknown
CpuFreqGovernors = OnDemand,Performance,UserSpace
CredType = auth/slurm
DataParserParameters = (null)
DebugFlags = AuditRPCs,Power
DefMemPerNode = UNLIMITED
DependencyParameters = (null)
DisableRootJobs = no
EioTimeout = 60
EnforcePartLimits = ALL
EpilogMsgTime = 2000 usec
FairShareDampeningFactor = 1
FederationParameters = (null)
FirstJobId = 1
GetEnvTimeout = 2 sec
GresTypes = gpu
GpuFreqDef = (null)
GroupUpdateForce = 1
GroupUpdateTime = 600 sec
HASH_VAL = Match
HashPlugin = hash/sha3
HealthCheckInterval = 0 sec
HealthCheckNodeState = ANY
HealthCheckProgram = (null)
InactiveLimit = 0 sec
InteractiveStepOptions = --interactive --preserve-env --pty $SHELL
JobAcctGatherFrequency = 30
JobAcctGatherType = jobacct_gather/cgroup
JobAcctGatherParams = (null)
JobCompHost = localhost
JobCompLoc = (null)
JobCompParams = (null)
JobCompPort = 0
JobCompType = (null)
JobCompUser = root
JobContainerType = (null)
JobDefaults = (null)
JobFileAppend = 0
JobRequeue = 1
JobSubmitPlugins = (null)
KillOnBadExit = 0
KillWait = 30 sec
LaunchParameters = (null)
Licenses = (null)
LogTimeFormat = rfc5424_ms,format_stderr
MailDomain = (null)
MailProg = /bin/mail
MaxArraySize = 257
MaxBatchRequeue = 5
MaxDBDMsgs = 10000
MaxJobCount = 257
MaxJobId = 67043328
MaxMemPerNode = UNLIMITED
MaxNodeCount = 5
MaxStepCount = 40000
MaxTasksPerNode = 512
MCSPlugin = (null)
MCSParameters = (null)
MessageTimeout = 210 sec
MinJobAge = 300 sec
MpiDefault = pmix
MpiParams = (null)
NEXT_JOB_ID = 3
NodeFeaturesPlugins = (null)
OverTimeLimit = 0 min
PluginDir = /opt/slurm/lib/slurm
PlugStackConfig = (null)
PreemptMode = OFF
PreemptParameters = (null)
PreemptType = (null)
PreemptExemptTime = 00:00:00
PrEpParameters = (null)
PrEpPlugins = prep/script
PriorityParameters = (null)
PrioritySiteFactorParameters = (null)
PrioritySiteFactorPlugin = (null)
PriorityDecayHalfLife = 7-00:00:00
PriorityCalcPeriod = 00:05:00
PriorityFavorSmall = no
PriorityFlags =
PriorityMaxAge = 7-00:00:00
PriorityType = priority/multifactor
PriorityUsageResetPeriod = NONE
PriorityWeightAge = 0
PriorityWeightAssoc = 0
PriorityWeightFairShare = 0
PriorityWeightJobSize = 0
PriorityWeightPartition = 0
PriorityWeightQOS = 0
PriorityWeightTRES = (null)
PrivateData = none
ProctrackType = proctrack/cgroup
PrologEpilogTimeout = 65534
PrologFlags = Alloc,Contain
PropagatePrioProcess = 0
PropagateResourceLimits = ALL
PropagateResourceLimitsExcept = (null)
RebootProgram = /sbin/reboot
ReconfigFlags = KeepPartState
RequeueExit = (null)
RequeueExitHold = (null)
ResumeFailProgram = (null)
ResumeProgram = /etc/slurm/scripts/resume_program.sh
ResumeRate = 0 nodes/min
ResumeTimeout = 1800 sec
ResvEpilog = (null)
ResvOverRun = 0 min
ResvProlog = (null)
ReturnToService = 1
SchedulerParameters = (null)
SchedulerTimeSlice = 30 sec
SchedulerType = sched/backfill
ScronParameters = (null)
SelectType = select/cons_tres
SelectTypeParameters = CR_CPU
SlurmUser = slurm(401)
SlurmctldAddr = (null)
SlurmctldDebug = verbose
SlurmctldHost[0] = slurmctld-primary(10.0.0.99)
SlurmctldLogFile = /dev/null
SlurmctldPort = 6817
SlurmctldSyslogDebug = (null)
SlurmctldPrimaryOffProg = (null)
SlurmctldPrimaryOnProg = (null)
SlurmctldTimeout = 300 sec
SlurmctldParameters = idle_on_node_suspend,power_save_min_interval=0,node_reg_mem_percent=75,enable_configless,disable_triggers
SlurmdDebug = info
SlurmdLogFile = /var/log/slurmd.log
SlurmdParameters = (null)
SlurmdPidFile = /var/run/slurm/slurmd.pid
SlurmdPort = 6818
SlurmdSpoolDir = /var/spool/slurmd
SlurmdSyslogDebug = (null)
SlurmdTimeout = 180 sec
SlurmdUser = root(0)
SlurmSchedLogFile = (null)
SlurmSchedLogLevel = 0
SlurmctldPidFile = /var/run/slurm/slurmctld.pid
SLURM_CONF = /etc/slurm/slurm.conf
SLURM_VERSION = 24.11.5
SrunEpilog = (null)
SrunPortRange = 0-0
SrunProlog = (null)
StateSaveLocation = /mnt/efs/slurm/statesave
SuspendExcNodes = login-[1-1],
SuspendExcParts = (null)
SuspendExcStates = DYNAMIC_FUTURE,DYNAMIC_NORM
SuspendProgram = /etc/slurm/scripts/suspend_program.sh
SuspendRate = 0 nodes/min
SuspendTime = 60 sec
SuspendTimeout = 60 sec
SwitchParameters = (null)
SwitchType = (null)
TaskEpilog = (null)
TaskPlugin = task/cgroup,task/affinity
TaskPluginParam = (null type)
TaskProlog = (null)
TCPTimeout = 2 sec
TLSParameters = (null)
TLSType = tls/none
TmpFS = /tmp
TopologyParam = RoutePart
TopologyPlugin = topology/default
TrackWCKey = no
TreeWidth = 16
UsePam = no
UnkillableStepProgram = (null)
UnkillableStepTimeout = 1050 sec
VSizeFactor = 0 percent
WaitTime = 0 sec
X11Parameters = (null)
Cgroup Support Configuration:
AllowedRAMSpace = 100.0%
AllowedSwapSpace = 0.0%
CgroupMountpoint = /sys/fs/cgroup
CgroupPlugin = autodetect
ConstrainCores = yes
ConstrainDevices = no
ConstrainRAMSpace = yes
ConstrainSwapSpace = no
EnableControllers = no
IgnoreSystemd = no
IgnoreSystemdOnFailure = no
MaxRAMPercent = 100.0%
MaxSwapPercent = 100.0%
MemorySwappiness = (null)
MinRAMSpace = 30MB
SystemdTimeout = 1000 ms
MPI Plugins Configuration:
PMIxCliTmpDirBase = (null)
PMIxCollFence = (null)
PMIxDebug = 0
PMIxDirectConn = yes
PMIxDirectConnEarly = no
PMIxDirectConnUCX = no
PMIxDirectSameArch = no
PMIxEnv = (null)
PMIxFenceBarrier = no
PMIxNetDevicesUCX = (null)
PMIxTimeout = 300
PMIxTlsUCX = (null)
Slurmctld(primary) at slurmctld-primary is UP
Aurora が同じリージョンに起動している
DB のホスト名が確認できました。アカウント ID を付与した名前で同リージョンに Aurora MySQL が起動していました。MySQL のバージョンアップも AWS PCS 側でやってくれるのでしょうから、手間が減って嬉しいです。
StorageHost = pcs-n6bosx3ar3-123456798012.cluster-cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
StorageLoc = slurm_acct_db
StorageParameters = SSL_CAPATH=/etc/pki/ca-trust/extracted/pem/directory-hash/
StoragePort = 3306
StorageType = accounting_storage/mysql
StorageUser = slurm
RDS 自体は別のネットワークありますね。クラスター名で名前解決すると.instance1.
という名前を確認できました。
$ nslookup pcs-n6bosx3ar3-123456789012.cluster-cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
pcs-n6bosx3ar3-123456789012.cluster-cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com canonical name = pcs-n6bosx3ar3-123456789012-instance1.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com.
Name: pcs-n6bosx3ar3-123456789012-instance1.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
Address: 172.35.2.29
調べてみると、DB インスタンスは 2 台起動していることは確認できました。172.35.0.0/16
でサブネットも分かれているようなので、マルチ AZ で冗長化されているような感じはします。
$ nslookup pcs-n6bosx3ar3-123456789012-instance1.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com.
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: pcs-n6bosx3ar3-123456789012-instance1.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
Address: 172.35.2.29
$ nslookup pcs-n6bosx3ar3-123456789012-instance2.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com.
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: pcs-n6bosx3ar3-123456789012-instance2.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com
Address: 172.35.1.153
$ nslookup pcs-n6bosx3ar3-123456789012-instance3.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com.
Server: 10.0.0.2
Address: 10.0.0.2#53
** server can't find pcs-n6bosx3ar3-123456789012-instance3.cb3gw4xyrzpt.ap-northeast-1.rds.amazonaws.com.: NXDOMAIN
調査結果
AWS 管理の Slurm アカウンティングデータベースは、Aurora MySQL がマルチ AZ 冗長化構成で 2 台起動している様子でした。
まとめ
AWS PCS で Slurm アカウンティングをサポートしました。マネージドサービスの AWS PCS なので、データベースの管理も利用者側は不要の親切設計でした。
おわりに
ジョブの実行履歴が保存できないなどの理由で Slurm アカウンティング非対応の AWS PCS を見送り、AWS ParallelCluster を利用していたユーザーにとってはありがたいアップデートでした。