概要
で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])
このようにmode=idle
がほぼ全てを占めてしまうのでよくありません。アイドル状態は監視する必要ないので外しましょう。
rate(node_cpu_seconds_total{mode!="idle"}[1m])
マルチコアノードで、全CPUの平均値を出したい時は
avg without(cpu) (rate(node_cpu_seconds_total{mode!="idle"}[1m]))
このように設定すれば良いです。
Saturation
飽和状態としてロードアベレージを使います。
- node_load1
- node_load5
- node_load15
がありますが、これらは
でのロードアベレージと同じ値です。
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
Saturation
飽和状態としてSwapの使用率を使います。
何を飽和状態とするかはそのシステムによって独自で定義することになると思います。
(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100
swapを用意してメモリ負荷を上げると、メモリを使い切り
以下のようにSwap使用率が上がります。
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数となっています。
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
このようにグラフ化されます。
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
iostat
のavgqu-sz
の値を出します。
rate(node_disk_io_time_weighted_seconds_total[1m])
負荷を与えるとこうなります。
Errors
Node exporterではエラーは取れないのでスキップします。
ネットワーク
netdevコレクタを使います。
- device
ラベルがあります。
Utilization
送受信のネットワーク帯域幅を使用率とします。
受信
rate(node_network_receive_bytes_total[1m])
送信
rate(node_network_transmit_bytes_total[1m])
Saturation
飽和状態はdrop数
と定義して算出します。
受信
rate(node_network_receive_drop_total[1m])
送信
rate(node_network_transmit_drop_total[1m])
Errors
エラーはnode_network_receive_errs_total
とnode_network_transmit_errs_total
のメトリクスが提供されているのでそれを使います。
受信
rate(node_network_receive_errs_total[1m])
送信
rate(node_network_transmit_errs_total[1m])
まとめ
USEメソッドに基づいて
- CPU
- メモリ
- ディスク
- ネットワーク
の各リソースのモニタリング用のPromQLを紹介しました。