この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の11日目です。
それでは11日目は mackerel-plugin-multicore
です。
mackerel-plugin-multicoreはマルチコアのCPUを監視するためのプラグインです。 Mackerelではmackerel-agentが送るシステムメトリックスでもCPUの使用率を見れます。 しかし、個々のCPUの利用状況を見ることができません。そこでmulticoreプラグインの出番なのです!
インストールと設定手順
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を再起動してください。
見れるメトリック
今日は有志の協力のお陰で画像があります!
/proc/stat
で見れる情報についてはLinuxの監視のときにも触れましたね。
cpuの項目について詳しく書いてる方がいました。とてもわかりやすいので参考にどうぞ。
では具体的に見ていきましょう。
各グラフ定義ごとに説明します。
それでは各グラフ定義ごとに説明します。
また表に出てくる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からシステムがどんな振る舞いをしているか読み解く方法の一例については過去に纏めたことがあるのでどうぞ。
その他について簡単に説明します。
system
多くのプログラムのCPU利用の殆どはuserです。 ですのでsystemはuserの1割から2割程度で落ち着くことが多いでしょう。 しかし時々systemが跳ねることがあります。 それはDiskやネットワークなどのカーネル側に負荷がかかる処理が行われている事を示しています。 例えばバッチ処理で大量のファイルの更新を行っていたり、メモリアクセスが頻繁に行われている場合などがそれに当たります。 このようにsystemが跳ねているときはdiskやトラフィックなども合わせて見るようにしましょう。irq/softirq
割り込みによるCPU実行時間の割合です。 マルチスレッドなどを実現するために割り込みや優先順位の付け替えを実施した際にかかったCPU負荷を表していて、これらの値が高い場合、割り込みの多い処理が複数実行されていることがわかります。 割り込みが多い=アプリケーション側に問題があるときですが私が経験したことにCentOS5未満のカーネルはsoftirqの処理をうまく複数のコアに分散出来ないという問題がありました。 新しいカーネルは既に対応されていますが仮にCentOS5でsoftirqが高い場合にこの点を疑ってみてください。 softirqについては id:y_uuki さんが素晴らしい解説をしているので必見です!!
blog.yuuk.iosteal/guest/guest_nice
これらは仮想環境でのCPU利用率を示しています。 stealはゲストOSがCPUを使おうと思っていても他が使っていて割り当てられられなかった割合です。 クラウドをご利用の場合は自分でコントロールすることができません。 guestとguest_niceはホストOS側で高くなる値です。 もし自分たちでプライベートクラウドを構築している場合はリソース割当の目安になります。 また本来はguest/guest_nice
は他の値が合算されているのですがmulticoreはそこを引いて計算後の値を表示してくれます。 細かい配慮ですが使う側としてはとてもうれしいですね!
multicoreはコア数が増えれば増えるほど結果も多くなります。32コアの場合、200個以上のメトリックを吐き出すことになりますのでご利用は計画的に!!
その場合は include_pattern
で絞り込むのが便利です。実際にMackerelユーザさんの事例を紹介します。
11日目はCPUに関わるmulticoreプラグインについての説明でした。
明日は意外と監視をしていないのでは?そんなみなさんも使いやすい inode
です。
引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!