そーだいなるらくがき帳

そーだいが自由気侭に更新します。

CPUの監視 ~ mackerel-plugin-multicoreを読み解く

この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の11日目です。

qiita.com

soudai.hatenablog.com

それでは11日目は mackerel-plugin-multicore です。

mackerel-plugin-multicoreはマルチコアのCPUを監視するためのプラグインです。 Mackerelではmackerel-agentが送るシステムメトリックスでもCPUの使用率を見れます。 しかし、個々のCPUの利用状況を見ることができません。そこでmulticoreプラグインの出番なのです!

github.com

インストールと設定手順

multicoreのプラグイン/proc/stat の中身を可視化してくれるプラグインです。

プラグインプラグイン集として提供しているパッケージの mackerel-agent-plugins に含まれています。 インストール先は /usr/bin/mackerel-plugin-multicore です。

次にMackerelのプラグインはコマンドですので実行する事ができます。

※/usr/bin はPATHが通っているので省略出来ます

-- /usr/bin はPATHが通っているので省略出来ます
# mackerel-plugin-multicore
multicore.cpu.cpu1.user 0.000000        1512906320
multicore.cpu.cpu1.nice 0.000000        1512906320
multicore.cpu.cpu1.system       0.000000        1512906320
multicore.cpu.cpu1.idle 100.000000      1512906320
multicore.cpu.cpu1.iowait       0.000000        1512906320
multicore.cpu.cpu1.irq  0.000000        1512906320
multicore.cpu.cpu1.softirq      0.000000        1512906320
multicore.cpu.cpu1.steal        0.000000        1512906320
multicore.cpu.cpu1.guest        0.000000        1512906320
multicore.cpu.cpu1.guest_nice   0.000000        1512906320
multicore.cpu.cpu2.user 0.000000        1512906320
multicore.cpu.cpu2.nice 0.000000        1512906320
multicore.cpu.cpu2.system       0.000000        1512906320
multicore.cpu.cpu2.idle 100.000000      1512906320
multicore.cpu.cpu2.iowait       0.000000        1512906320
multicore.cpu.cpu2.irq  0.000000        1512906320
multicore.cpu.cpu2.softirq      0.000000        1512906320
multicore.cpu.cpu2.steal        0.000000        1512906320
multicore.cpu.cpu2.guest        0.000000        1512906320
multicore.cpu.cpu2.guest_nice   0.000000        1512906320
multicore.cpu.cpu3.user 0.000000        1512906320
multicore.cpu.cpu3.nice 0.000000        1512906320
multicore.cpu.cpu3.system       0.000000        1512906320
multicore.cpu.cpu3.idle 100.000000      1512906320
multicore.cpu.cpu3.iowait       0.000000        1512906320
multicore.cpu.cpu3.irq  0.000000        1512906320
multicore.cpu.cpu3.softirq      0.000000        1512906320
multicore.cpu.cpu3.steal        0.000000        1512906320
multicore.cpu.cpu3.guest        0.000000        1512906320
multicore.cpu.cpu3.guest_nice   0.000000        1512906320
multicore.cpu.cpu0.user 0.000000        1512906320
multicore.cpu.cpu0.nice 0.000000        1512906320
multicore.cpu.cpu0.system       0.000000        1512906320
multicore.cpu.cpu0.idle 100.000000      1512906320
multicore.cpu.cpu0.iowait       0.000000        1512906320
multicore.cpu.cpu0.irq  0.000000        1512906320
multicore.cpu.cpu0.softirq      0.000000        1512906320
multicore.cpu.cpu0.steal        0.000000        1512906320
multicore.cpu.cpu0.guest        0.000000        1512906320
multicore.cpu.cpu0.guest_nice   0.000000        1512906320
multicore.loadavg_per_core.loadavg5     0.003750        1512906320

上記は4コアCPUの場合の結果です。

設定ファイルであるmackerel-agent.confは標準では /etc/mackerel-agent/mackerel-agent.conf にインストールされます。 こちらに下記のとおり追記しましょう。

[plugin.metrics.multicore]
command = "mackerel-plugin-multicore"

以上を行った上でmackerel-agentを再起動してください。

見れるメトリック

f:id:Soudai:20171211160722p:plain

今日は有志の協力のお陰で画像があります! /proc/stat で見れる情報についてはLinuxの監視のときにも触れましたね。 cpuの項目について詳しく書いてる方がいました。とてもわかりやすいので参考にどうぞ。

www.s-arcana.co.jp

では具体的に見ていきましょう。

各グラフ定義ごとに説明します。 それでは各グラフ定義ごとに説明します。 また表に出てくるdiffとはプラグイン上で差分値計算をするかどうかです。 となっている項目はプラグインで前回の実行時の値と差分値計算して出力しています。

MultiCore loadavg5 per core

メトリック名(ラベル) プラグインの出力名 diff 説明
loadavg5 multicore.loadavg_per_core.loadavg5 loadavg5をコア数で割った値

システムメトリックのloadavg5はコア数関係ない値になっています。 そのため、一見多そうに見えてもコア数が多い場合に、コア数で割ると実は問題ないことがあります。 そこでこの loadavg5をコア数で割った値 である MultiCore loadavg5 per core が良い指標になります。

MultiCore CPU

メトリック名(ラベル) プラグインの出力名 diff 説明
user multicore.cpu.cpu1.user ユーザプロセス(システムプロセス以外)のCPU利用率
nice multicore.cpu.cpu1.nice 実行優先度を変更した(nice値)ユーザプロセスによるCPU使用率
system multicore.cpu.cpu1.system システムプロセス(カーネル)のCPU利用率
idle multicore.cpu.cpu1.idle アイドル状態のCPU利用率
ioWait multicore.cpu.cpu1.iowait I/O終了待ち時間のCPU利用率
irq multicore.cpu.cpu1.irq irq(ハードウェア割り込み)処理でのCPU利用率
softirq multicore.cpu.cpu1.softirq softirq(ソフトウェア割り込み)処理でのCPU利用率
steal multicore.cpu.cpu1.steal ゲストOSがCPUリソースを割り当ててもらえなかったCPU利用率
guest multicore.cpu.cpu1.guest ゲストOSが利用した分のCPU利用率
guest_nice multicore.cpu.cpu1.guest_nice ゲストOSの実行優先度を変更した(nice値)ユーザプロセスによるCPU利用率

各CPU毎の使用率が可視化されます。仮に MultiCore loadavg5 per core が少なくても、1つのコアがずっと user 100% で動いており、他のコアが全く仕事をしていないかもしれません。 マルチコアのCPUを使い切れているかどうかはサーバをリソースの有効活用の中では非常に大切な指標です。 逆に全てのコアを使い切ってもCPUが足りない場合はサーバを増やしたり、コア数を増やすことの指標にあります。 このように他の指標と組み合わせることでよりシステムの振る舞いが見えてくるのです。

CPUの読み解き方

今回はもう少し踏み込んでCPUの解説をします。 基本的にはシステムメトリックスのCPUと見方は同じです。 user,system,idle,ioWaitからシステムがどんな振る舞いをしているか読み解く方法の一例については過去に纏めたことがあるのでどうぞ。

その他について簡単に説明します。

  1. system
    多くのプログラムのCPU利用の殆どはuserです。 ですのでsystemはuserの1割から2割程度で落ち着くことが多いでしょう。 しかし時々systemが跳ねることがあります。 それはDiskやネットワークなどのカーネル側に負荷がかかる処理が行われている事を示しています。 例えばバッチ処理で大量のファイルの更新を行っていたり、メモリアクセスが頻繁に行われている場合などがそれに当たります。 このようにsystemが跳ねているときはdiskやトラフィックなども合わせて見るようにしましょう。

  2. irq/softirq
    割り込みによるCPU実行時間の割合です。 マルチスレッドなどを実現するために割り込みや優先順位の付け替えを実施した際にかかったCPU負荷を表していて、これらの値が高い場合、割り込みの多い処理が複数実行されていることがわかります。 割り込みが多い=アプリケーション側に問題があるときですが私が経験したことにCentOS5未満のカーネルはsoftirqの処理をうまく複数のコアに分散出来ないという問題がありました。 新しいカーネルは既に対応されていますが仮にCentOS5でsoftirqが高い場合にこの点を疑ってみてください。 softirqについては id:y_uuki さんが素晴らしい解説をしているので必見です!!
    blog.yuuk.io

  3. steal/guest/guest_nice
    これらは仮想環境でのCPU利用率を示しています。 stealはゲストOSがCPUを使おうと思っていても他が使っていて割り当てられられなかった割合です。 クラウドをご利用の場合は自分でコントロールすることができません。 guestとguest_niceはホストOS側で高くなる値です。 もし自分たちでプライベートクラウドを構築している場合はリソース割当の目安になります。 また本来は guest/guest_nice は他の値が合算されているのですがmulticoreはそこを引いて計算後の値を表示してくれます。 細かい配慮ですが使う側としてはとてもうれしいですね!

multicoreはコア数が増えれば増えるほど結果も多くなります。32コアの場合、200個以上のメトリックを吐き出すことになりますのでご利用は計画的に!! その場合は include_pattern で絞り込むのが便利です。実際にMackerelユーザさんの事例を紹介します。

sugartoys.hatenablog.com

11日目はCPUに関わるmulticoreプラグインについての説明でした。 明日は意外と監視をしていないのでは?そんなみなさんも使いやすい inode です。 引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!

12日目 mackerel-plugin-inode