はじめに
Linuxサーバを運用していて「特定のコアだけに負荷が偏っていないか?」「シングルスレッドプロセスの処理が頭打ちになっていないか」を確認したいシーンは少なくないかと思います。しかし、New Relic の標準 Infrastructure Agent ではコアごとのメトリクスが収集されません。
今回は、エージェントの拡張機能である New Relic Flex を使い、mpstat の出力をパースして New Relic に送り込み、コアごとの時系列グラフを作成する方法をご紹介します。
New Relic Flex とは
New Relic FlexはInfrastructure Agentにバンドルされる形で提供されており、独自のイベントやメトリクスを定期的に収集し、New Relicに送信することができます。設定ファイルのフォーマットに合わせることで、煩雑な処理を書かずに簡単に情報を送信できます。
監視設定
確認環境
Amazon Linux 2
Infrastructure Agent ver. 1.72.8
Flex 設定ファイル
/etc/newrelic-infra/integrations.d/cpu-core-flex.yml を作成し、以下の設定を投入します。
integrations:
- name: nri-flex
config:
name: customCpuCoreMetrics
apis:
- name: CpuStats
commands:
- run: |
S_TIME_FORMAT=24h LANG=C mpstat -P ALL 1 1 | awk '/^[0-9]/ && $2 ~ /^[0-9]+$/ {
s = sprintf("{\"cpu_id\":\"cpu%s\",\"cpu_usr\":%s,\"cpu_nice\":%s,\"cpu_sys\":%s,\"cpu_iowait\":%s,\"cpu_irq\":%s,\"cpu_soft\":%s,\"cpu_steal\":%s,\"cpu_guest\":%s,\"cpu_gnice\":%s,\"cpu_idle\":%s}", $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
if (count++) { printf "," }
printf s
}
BEGIN { printf "[" }
END { print "]" }'
NRQLで可視化する
設定ファイルにて設定を行いデータが届いたら、NRQLで可視化します。
ポイントは、New RelicのUnit: Percentageに対応させるため、計算結果を / 100 することです。
FROM CpuStatsSample
SELECT average(100 - cpu_idle) / 100
FACET cpu_id
WHERE cpu_id != 'cpuall'
TIMESERIES
クエリ結果が正しく表示されたら、右列のCustomize this visualizationからUnitを選択し、Percentageを指定しましょう。
まとめ
標準機能で足りないときは、Flexを使い一工夫することで監視要件を満たすことができるケースもあります。
今回はAmazon Linux 2という限定した環境での対応だったためmpstatを利用しましたが、/proc/配下を参照することでより詳細な情報を得られる場合もあります。実装の手間やデータの取り回しの容易さを天秤にかけつつ、活用いただけますと幸いです。
