あきろぐ

いろいろめもするよ🐈🐈🐈

ZabbixでCPUコアごとの使用率を出したい

Zabbix上ではデフォルトのテンプレート(Template OS Linux)で全CPUの使用率を求めるアイテムはデフォルトで入っていますが、CPUコアごとに出せるんだっけ?と思ったので調べました。

公式ドキュメントを見る

まずは、公式ドキュメントをみてみます。
www.zabbix.com

CPU使用率を求めるアイテムは、"system.cpu.util[cpu,type,mode]"ですね。括弧に中に設定する値は以下の通りです。

- cpu - CPU番号(デフォルトは全CPU)
- type - 何のCPU使用率を出すか:idle, nice, user(デフォルト)、system (Windowsでのデフォルト)、 iowait, interrupt, softirq, steal
- mode - CPU使用率を何分間平均で出すか指定する:avg1 (1分間の平均、デフォルト)、avg5 (5分間の平均)、avg15 (15分以内の平均)

ここで沸いた疑問が「CPU番号は何を指しているのか分からない・・・」。
CPUコアのことなのかCPUの数を指しているのかな。

 調べてみると、CPU番号はCPUコアごとっぽいことは分かりました。
http://www.zabbix.jp/node/674

しかし、確証は得られていないので引き続き調査したところ、Zabbixのローレベルディスカバリ機能にてCPUのコア情報が取得できることが判明しました。ディスカバリルールの設定時に“system.cpu.discovery”をディスカバリルールのキーにして、アイテムsystem.cpu.utilのcpu番号のところに{#CPU.NUMBER}というマクロを設定すると自動でCPUコアの数分の使用率を取得してくるようです。
www.zabbix.com

ローレベルディスカバリ機能を使う

実際に設定してみます。

ディスカバリールールを作成

f:id:akngo22:20190710210811j:plain

プロトタイプの作成

アイテムのキーはマクロを使って以下のように設定します。
system.cpu.util[{#CPU.NUMBER},user,avg1]
f:id:akngo22:20190710203916j:plain

後はデータ取得されるまで少し待つだけ。
その結果、CPUコア数は48個であることが分かりました。

ここでまた疑問を持ちました。
このCPUコア数は物理CPUのコア数?、または論理CPUのコア数?

もう一度、ドキュメント読んでみました。下記の文言を発見。
CPU のハイパースレッド処理が有効である場合、物理か論理か区別できなさそうでした。

To note, a clear distinction cannot be made between actual, physical processors, cores and hyperthreads.

監視対象サーバーを確認してみる

実際に監視サーバーのCPU情報見れば良いかと思い、/proc/cpuinfoファイルを見てみました。
調べるのは物理CPUの数、CPUごとのコア数、論理プロセッサーの数です。grepコマンド駆使して見ると分かりやすいです。

#物理CPUの数(physical idを抜き出して重複箇所はまとめて行カウント)
$ grep physical.id /proc/cpuinfo | sort -u | wc -l
#CPUごとのコア数
$ grep cpu.cores /proc/cpuinfo | sort -u
#論理プロセッサーの数
$ grep processor /proc/cpuinfo | wc -l

コマンド実行した結果です。

物理CPUが2個でCPUごとのコア数が12個なので、全部でコア数は2x12=24個。
しかし、論理プロセッサが48個なのでハイパースレッド機能が有効になっており、各コアが2つのスレッドに分かれていることが分かりました。つまり、論理プロセッサ(論理コア数)は2x(12x2)=48個です。

このことから、Zabbixで検出しているCPUコア数は論理コア数である確証が得られました。

私の頭の中のイメージはこんなです。
f:id:akngo22:20190710225516p:plain

Grafana画面に反映する

すっきりしたので、あとは画面反映するだけです。
イメージはCPUコア数1個しかないですが、複数あれば時系列グラフにその数分表示されます。
アイテムのところを/cpu util per core/としているのは、cpuコア数が複数ある場合「cpu util per core 0」、「cpu util per core 1」という風に末尾の数字が増えていくだけなので、「cpu util per core」がアイテム名にあるものを全部出力させるようにスラッシュで囲っています。
f:id:akngo22:20190710211341j:plain

おしまい。