AWS ParallelCluster 各ノードの取得メトリクス追加方法

CloudWatch Agentの設定はPostinstallを利用して変更できます。
2020.11.22

クラスターのモニタリング

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

設定手順

下記が各ノードのメトリクス取得までの流れです。

  1. 各ノード起動時にスクリプトを実行する
  2. スクリプトでパラメータストアから設定ファイルを取得しCloudWatchAgentに反映させる
  3. CloudWatchAgentが追加のメトリクスをPutする

これを実現するためにParallelClusterの設定作業は下記になります。

  1. パラメータストアに設定ファイルを設置
  2. S3バケットに起動時実行用のスクリプトを配置
  3. 各ノードが起動時に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の部分はパラメータストアで作成した名前を入力します。

postinstall.sh

#!/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

multi-cluster

[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)されるため毎回インスタンス起動時に走ります。

以上、網走の大村@コンサル部でした。