カスタムメトリクスでEC2のvCPU(CPUコア)別にメトリクス収集してみた

2023.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回のテーマ

こんにちは、AWS事業本部コンサルティング部のこーへいです。

今回のテーマは「カスタムメトリクスでEC2のvCPU(CPUコア)別にメトリクス収集してみた」です。

背景

EC2のCPU使用率を収集する際は標準メトリクスを用いることが多く、vCPU(CPUコア)別にメトリクスを収集する機会はなかなかありません。

ですがトラブルシューティングなどでvCPU別にメトリクス収集を行いたい場合もあり、その場合に備え今回はCloudWatchエージェントを用いたカスタムメトリクスでvCPU別にメトリクスを収集してみます。

調査してみる

0. 前提

今回CloudWatchエージェントをインストールして、カスタムメトリクスで収集するまでの解説は省略します。

下記記事などを参照にすると良いです。

1. vCPUを確認する

まずは対象EC2インスタンスにログインし、下記コマンドを実行します。

$ mpstat -P ALL

すると下記のようにCPUのステータスが表示されますが、今回検証に用いたEC2インスタンスはt3.nanoなので、vCPUが2つありますね。

インスタンスタイプ毎のvCPU数を確認するためにはインスタンスタイプ - Amazon EC2 - AWSを確認してみてください。

allと記載されているものは全てのCPUコア間で集計されたトータルCPUで、allを構成するそれぞれのvCPU(CPUコア)は0から順に数字を割り当てられています。

今回はこのCPU0や1のメトリクスを収集します。

2. CloudWatchエージェントに設定ファイルを読み込ませる

今回は下記サンプル設定ファイルを用意しました、こちらをパラメータストア等に格納しCloudWatchエージェントに読み込ませてください。

{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "metrics": {
        "aggregation_dimensions": [
            [
                "InstanceId"
            ]
        ],
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "cpu": {
                "measurement": [
                    "cpu_usage_idle",
                    "cpu_usage_iowait",
                    "cpu_usage_user",
                    "cpu_usage_system"
                ],
                "metrics_collection_interval": 10,
                "resources": [
                    "*"
                ],
                "totalcpu": true
            }
        }
    }
}

今回特に大事な箇所は以下となります。

// ... 略
            "cpu": {
                "measurement": [
                    "cpu_usage_idle",
                    "cpu_usage_iowait",
                    "cpu_usage_user",
                    "cpu_usage_system"
                ],
// ... 略
                "totalcpu": true
// ... 略

その後再び対象EC2インスタンスにログインし、CloudWatchエージェントの設定を下記コマンドを実行して確認します。

$ cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml

すると[inputs]セクションにて下記のように表示されます。

[inputs]

  [[inputs.cpu]]
    fieldpass = ["usage_idle", "usage_iowait", "usage_user", "usage_system"]
    interval = "10s"
    percpu = true
    totalcpu = true
    [inputs.cpu.tags]
      "aws:StorageResolution" = "true"
      metricPath = "metrics"
キー値 バリュー値 備考
fieldpass ["usage_idle", "usage_iowait", "usage_user", "usage_system"] 収集するメトリクスが記載されている。
※収集したいメトリクスを変更したい場合、CloudWatch エージェントにより収集されるメトリクスから収集したいメトリクスを参照し、設定ファイルの記述を変更する
percpu true vCPU別にメトリクスを収集するかを決定する
※falseへ設定変更不可
totalcpu true トータルのCPUメトリクスを収集するかを決定する
※falseへ設定変更可能

「percpu」と「totalcpu」がどちらもtrueに設定した状態で、Cloudwatchメトリクスを確認するとCPU0と1や、先程allと記載されていた全てのCPUコア間で集計されたcpu-totalが収集されています!

補足

その後検証したところ、「totalcpu」をfalseに設定変更は可能でしたが「percpu」をfalseに設定変更は行えませんでした。

CloudWatchエージェント設定ファイルを手動で作成または編集するでも、「totalcpu」の項目はあるものの「percpu」の項目がないので、ユーザーは設定変更を行えず「percpu」はtrueのみの設定項目かと思われます。

結論

普段CPU使用率は標準メトリクスで収集することが多く、中々vCPU(CPUコア)別のメトリクスについて目にする機会が珍しかったかもしれません。

ですが、CloudWatchエージェントを用いてカスタムメトリクスとして収集すると思ったより簡単にvCPU別にメトリクス収集することができました。

トラブルシューティングなどで、vCPU別に調査したい場合この記事を参考にしていただければと思います。