
AWS ParallelCluster 各ノードの取得メトリクス追加方法
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
クラスターのモニタリング
ParallelClusterのヘッドノード、コンピュートノードのモニタリング設定します。
- AWS ParallelClusterはAWSがサポートする、HPCクラスターの管理ツールです。
 - 各ノードにCloudWatchAgentを利用してメモリ使用率など取得メトリクスを追加します。
 
検証環境
| 項目 | 値 | 
|---|---|
| ParallelCluster | 2.10.0 | 
| OS | Ubuntu 18.04 LTS | 
| AMI | aws-parallelcluster-2.10.0-ubuntu-1804-lts-hvm-arm64-202011172100 | 
設定手順
下記が各ノードのメトリクス取得までの流れです。
- 各ノード起動時にスクリプトを実行する
 - スクリプトでパラメータストアから設定ファイルを取得しCloudWatchAgentに反映させる
 - CloudWatchAgentが追加のメトリクスをPutする
 



これを実現するためにParallelClusterの設定作業は下記になります。
- パラメータストアに設定ファイルを設置
 - S3バケットに起動時実行用のスクリプトを配置
 - 各ノードが起動時にS3バケット上のスクリプトを実行する
 
モニタリング内容の設定
AWS Systems ManagerのパラメータストアにCloudWatchAgentの追加設定ファイルを準備します。
pcluster-cloudwatch-configの名前で作成しました。メモリ使用率、ディスクI/O取得の設定を値に登録してします。

パラメータストア値の内容
{
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "disk": {
                "measurement": [
                    "used_percent",
                    "inodes_free"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "io_time",
                    "write_bytes",
                    "read_bytes",
                    "writes",
                    "reads"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
クラスター起動時の設定
ParallelClusterのPostinstall機能を利用します。各ノード起動時パラメータストアに保存したテキスト(設定ファイル)を読み取ります。設定ファイルをCloudWatch Agentに反映させるスクリプトを準備します。
スクリプトファイル作成
amazon-cloudwatch-agent-ctlコマンドでパラメータストアに保存した設定ファイルを読み込む内容です。
ssm:pcluster-cloudwatch-configの部分はパラメータストアで作成した名前を入力します。
#!/usr/bin/env bash # Add config to CloudWatch Agent amazon-cloudwatch-agent-ctl -a append-config -m ec2 -s -c ssm:pcluster-cloudwatch-config
S3バケット作成
スクリプトファイルはS3バケットに保存します。適当なバケット作成します。スクリプトファイルをアップロードします。
バケット作成。

ファイルをアップロード。

クラスター設定
CloudWatchAgentの設定ファイル追加で必要な箇所は下記です。
- S3バケットへ読み取りアクセスのための設定
 - スクリプトファイルの実行パスの設定
 - パラメータストアに読み取りアクセスのためのポリシー追加
 
s3_read_resource = arn:aws:s3:::pcluster-postinsall/* # pcluster-postinstallは任意のS3バケット名を指定 post_install = s3://pcluster-postinsall/postinstall.sh # pcluster-postinsall/postinstall.shは任意のスクリプトファイルのパスを指定 additional_iam_policies = arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
クラスター設定ファイル全文
検証時の設定ファイル内容です。下記の項目は環境に依存します。
- aws_region_name
 - key_name
 - vpc_id
 - master_subnet_id
 - compute_subnet_id
 
[aws]
aws_region_name = us-east-1
[global]
cluster_template = default
update_check = true
sanity_check = true
[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}
[cluster default]
key_name = sandbox-key-useast1
base_os = ubuntu1804
scheduler = slurm
vpc_settings = custom
s3_read_resource = arn:aws:s3:::pcluster-postinsall/*
post_install = s3://pcluster-postinsall/postinstall.sh
additional_iam_policies = arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
# Instance Type
master_instance_type = c6g.large
# Queue
queue_settings = 2x, 16x
# Tag
tags = { "Name" : "MultiQueue-Cluster" }
# --- VPC Setting ---
[vpc custom]
vpc_id = vpc-07edfc27679c9ca80
master_subnet_id = subnet-0ab2754446b2f87a4
compute_subnet_id = subnet-0ab2754446b2f87a4
use_public_ips = true
# --- EBS Setting ---
[ebs external_ebs]
shared_dir = /shared
volume_type = gp2
volume_size = 20
# --- ComputeNode Setting ---
[queue 2x]
compute_resource_settings = 2x
placement_group = DYNAMIC
compute_type = spot
[queue 16x]
compute_resource_settings = 16x
placement_group = DYNAMIC
compute_type = spot
[compute_resource 2x]
instance_type = c6g.2xlarge
max_count = 32
[compute_resource 16x]
instance_type = c6g.16xlarge
max_count = 8
クラスター作成
pcluster createコマンドで任意の管理名称を設定し、設定ファイルを引数に指定します。
> pcluster create multi-cluster -c multi-cluster
CloudWatchからメトリクス確認
クラスターが作成されヘッドノード(Name: MultiQueue-Cluster)と、ジョブを投げてコンピューノード(Name: Compute)を起動させました。
![]()
メモリ使用率を確認できます。メモリ使用率は標準メトリクスでは取得できないためCloudWatchAgentに追加設定が必要になりました。

おわりに
ヘッドノード、コンピューノードのサイジング時に活用できるのではないでしょうか。CloudWatchAgentの設定はParallelClusterに依存するわけではありません。今回のメモリ使用率、ディスクI/O以外も設定可能です。 Postinstallの処理はヘッドノードだとクラスター構築時の初回のみ、コンピューノードは起動後に終了(Terminate)されるため毎回インスタンス起動時に走ります。
以上、網走の大村@コンサル部でした。










