Carpe Diem

備忘録

Prometheus でNodeのモニタリング

概要

christina04.hatenablog.com

でNode exporterを使った基本的な監視方法を説明しましたが、今回は具体的にどんな項目をどう監視すべきかを説明します。

USEメソッド

サーバの監視すべき項目の指標としてUSEメソッドというものがあります。

項目 説明
Utilization リソースの使用率
Saturation リソースを割けずキューで処理待ちになっている仕事の量
Errors エラーイベントの数

各リソース(CPU、ディスク、メモリ、ネットワークなど)で↑の項目をチェックすべき、という指標です。

※とはいうもののリソースによって計測できないものも多々あります

環境

  • Prometheus 2.11.1
  • Ubuntu 18.04

Node exporterで具体的な設定をする

  • 1ノード
  • CPU: 2
  • Memory: 1GB

で検証します。

CPU

cpuコレクタを使います。

  • cpu
  • mode

の2つのラベルがあります。

Utilization

CPU使用率を調べるのにnode_cpu_seconds_totalがあります。
ただしそのまま使うと

rate(node_cpu_seconds_total[1m])

f:id:quoll00:20190728091007p:plain

このようにmode=idleがほぼ全てを占めてしまうのでよくありません。アイドル状態は監視する必要ないので外しましょう。

rate(node_cpu_seconds_total{mode!="idle"}[1m])

f:id:quoll00:20190728091349p:plain

マルチコアノードで、全CPUの平均値を出したい時は

avg without(cpu) (rate(node_cpu_seconds_total{mode!="idle"}[1m]))

このように設定すれば良いです。

f:id:quoll00:20190728091501p:plain

Saturation

飽和状態としてロードアベレージを使います。

  • node_load1
  • node_load5
  • node_load15

がありますが、これらは

dstatで見るポイント - Carpe Diem

でのロードアベレージと同じ値です。

normalizeしたい場合はコア数で割って下さい。

node_load1
/
count(count(node_cpu_seconds_total) without (mode)) without (cpu)

みたいな感じです。

Errors

Node exporterではCPUエラーは取れないのでスキップします。

メモリ

meminfoコレクタを使います。

Utilization

これまではメモリ使用率は計算が難しかったのですが、Linux kernel 3.14からはnode_memory_MemAvailable_bytesが使えるようになります。
メモリはゲージなのでrate()は使いません。

node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes

f:id:quoll00:20190728093033p:plain

f:id:quoll00:20190728093057p:plain

Saturation

飽和状態としてSwapの使用率を使います。
何を飽和状態とするかはそのシステムによって独自で定義することになると思います。

(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100

swapを用意してメモリ負荷を上げると、メモリを使い切り

f:id:quoll00:20190728114212p:plain

以下のようにSwap使用率が上がります。

f:id:quoll00:20190728114233p:plain

Errors

Node exporterではメモリエラーは取れないのでスキップします。

ディスク(filesystemコレクタ)

ディスクのキャパシティの方です。

filesystemコレクタには

  • device
  • fstype
  • mountpoint

のラベルがあります。

Utilization

ディスク容量

node_filesystem_avail_bytesで未使用なbytesが分かるので、ディスク使用率は以下のように出します。

1 - node_filesystem_avail_bytes / node_filesystem_size_bytes

inode

inodeについてはnode_filesystem_files_freeがフリー状態のinode数、node_filesystem_filesが総inode数となっています。

f:id:quoll00:20190729132022p:plain

Saturation

ディスクが飽和したらそもそも扱えないのでスキップします。

Errors

Node exporterではエラーは取れないのでスキップします。

ディスク(diskstatsコレクタ)

ディスクのスループットの方です。

diskstatsコレクタはiostat -xの値を出すことができ、ラベルとしては

  • device

があります。

Utilization

%util

iostat%utilの値を出します。

rate(node_disk_io_time_seconds_total[1m])

以下のように書き込み負荷を与えると

$ stress -d 2 --hdd-bytes 2G

このようにグラフ化されます。

f:id:quoll00:20190729114434p:plain

read I/O latency

読み出しI/Oのレイテンシは

rate(node_disk_read_time_seconds_total[1m])
/
rate(node_disk_reads_completed_total[1m])

write I/O latency

書き出しI/Oのレイテンシは

rate(node_disk_write_time_seconds_total[1m])
/
rate(node_disk_writes_completed_total[1m])

Saturation

iostatavgqu-szの値を出します。

rate(node_disk_io_time_weighted_seconds_total[1m])

負荷を与えるとこうなります。

f:id:quoll00:20190729114509p:plain

Errors

Node exporterではエラーは取れないのでスキップします。

ネットワーク

netdevコレクタを使います。

  • device

ラベルがあります。

Utilization

送受信のネットワーク帯域幅を使用率とします。

受信

rate(node_network_receive_bytes_total[1m])

f:id:quoll00:20190729130858p:plain

送信

rate(node_network_transmit_bytes_total[1m])

f:id:quoll00:20190729130912p:plain

Saturation

飽和状態はdrop数と定義して算出します。

受信

rate(node_network_receive_drop_total[1m])

送信

rate(node_network_transmit_drop_total[1m])

Errors

エラーはnode_network_receive_errs_totalnode_network_transmit_errs_totalのメトリクスが提供されているのでそれを使います。

受信

rate(node_network_receive_errs_total[1m])

送信

rate(node_network_transmit_errs_total[1m])

まとめ

USEメソッドに基づいて

  • CPU
  • メモリ
  • ディスク
  • ネットワーク

の各リソースのモニタリング用のPromQLを紹介しました。

ソース