入門監視 ch8 サーバー監視
- OSの標準的なメトリクス
- SSL証明書
- SNMP: Simple Network Management Protocol
- Webサーバー
- データベースサーバ
- ロードバランサ
- メッセージキュー
- キャッシュ
- DNS
- NTP
- それ以外の企業インフラにおける監視
- スケジュールジョブの監視
- ロギング
- まとめ
- 監視=システム管理者がやることと思われがち
- とはいえ、実際サーバ上で色々なことが起きているのは確か
- サーバレスアーキテクチャでも、プラットフォームを提供しFunctionを動かすサーバが存在する
OSの標準的なメトリクス
- 例
- CPU
- メモリ
- ロードアベレージ
- ネットワーク
- ディスク
- 本書では、これらの監視を散々批判してきた(2章等)
- 外側から「動いていること」を監視しろ
- CPU99%でも元気に動いていれば何も問題ない
- 外側から「動いていること」を監視しろ
- とはいえ役に立たないわけではない
- 正しいコンテキストで使えば強力
- 診断
- トラブルシューティング
- 全システムで自動的に記録しつつ、アラートは仕掛けない
- ツールがデフォルトで収集してくれること多し
- 意味と使い方について掘り下げていく
CPU
/proc/stat
由来
cpu 2018368 8488 422491 7155002 21474 0 8232 0 0 0 cpu0 506590 2145 112923 6572126 21251 0 3997 0 0 0 cpu1 490845 2908 101910 195839 51 0 642 0 0 0 cpu2 521977 1713 110418 190064 127 0 2788 0 0 0 cpu3 498955 1720 97239 196971 44 0 805 0 0 0 intr 62111844 11 211044 0 0 0 0 0 0 1 94371 0 0 7221747 0 0 0 0 0 0 0 0 0 0 329 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 363 134 1547878 0 1739216 16 1639231 111 1339 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 236212677 btime 1554113966 processes 361995 procs_running 4 procs_blocked 0 softirq 44430959 94 14581702 6905 381839 1456512 21 215301 14187172 0 13601413
top
コマンド
top - 16:27:06 up 5 days, 21:07, 1 user, load average: 2.25, 1.99, 1.55 Tasks: 324 total, 2 running, 276 sleeping, 0 stopped, 0 zombie %Cpu(s): 27.2 us, 4.9 sy, 0.2 ni, 67.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 8061240 total, 1389032 free, 4023856 used, 2648352 buff/cache KiB Swap: 2097148 total, 2049180 free, 47968 used. 3358072 avail Mem 15086 wand 20 0 2676624 873588 184264 R 57.9 10.8 10:22.27 Web Content 14775 wand 20 0 2404012 345500 169856 S 38.9 4.3 6:42.78 firefox ...
- アイドル
- id: idle
- 使用率
- us: user
- sy: system
- ni: niced processes
- 優先度付きプロセス
- hi: hardware interrupts
- si: software interrupts
- 待ち時間
- wa: iowait processes
- st: steal time
- steal時間
- 仮想化で生じるやつ。ゲストOSがCPUリソースを要求したが貰えなかった(他ゲスト/ホストOSと取り合い)
- 資料
- steal時間
メモリ
/proc/meminfo
由来free -m
コマンド- Mega Byteで表示
total used free shared buff/cache available Mem: 7872 3738 1532 324 2601 3498 Swap: 2047 46 2001
total
,used
,free
- 読んで字のごとし
buffers
cached
- 最近アクセスされたファイルのコンテンツ
- 最近追加された列
available
- 正確に利用可能なメモリ領域
free + buffers + cached
は正確ではない
- 最近削除された行
- システムのメモリを追加すべきかの判断には、
-/+ buffers/cache
やavailable
を使う /proc/meminfo
の中身をそのまま出力し、自前で計算するツールもある
MemTotal: 8061240 kB MemFree: 1250280 kB MemAvailable: 3267104 kB Buffers: 643300 kB Cached: 1833608 kB SwapCached: 2320 kB ...
- Swap
- OOMKiller: Out of Memory Killer
- メモリ不足(OOM)でシステムが停止する恐れがある際、メモリリソースを多く使用しているプロセスをkillする人
- killされるプロセスは予想できない
- こいつが呼び出されるということは、どこかで問題が起きている
- OOMKillerの呼び出しを監視する
- システムログをkilled processでgrep
ネットワーク
/proc/net/dev
由来
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed br-d6ad1890a99a: 15792083 8497 0 0 0 0 0 0 2522929 8840 0 0 0 0 0 0 docker0: 3205233 37239 0 0 0 0 0 0 258340666 45014 0 0 0 0 0 0 veth9ea233d: 271594 2181 0 0 0 0 0 0 741011 2871 0 0 0 0 0 0 br-7894b2a516f9: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 lo: 44797401 373099 0 0 0 0 0 0 44797401 373099 0 0 0 0 0 0 vethdc75bbf: 0 0 0 0 0 0 0 0 131095 706 0 0 0 0 0 0 veth5f516da: 0 0 0 0 0 0 0 0 127054 651 0 0 0 0 0 0 vethc6244d8: 0 0 0 0 0 0 0 0 129957 672 0 0 0 0 0 0 veth0c1b442: 12455234 25048 0 0 0 0 0 0 4560915 23940 0 0 0 0 0 0 br-6d041025d893: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 br-63ba6607a272: 0 0 0 0 0 0 0 0 125305 629 0 0 0 0 0 0 veth1714e1c: 0 0 0 0 0 0 0 0 132954 717 0 0 0 0 0 0 vethe420c89: 4231969 6683 0 0 0 0 0 0 1434037 6534 0 0 0 0 0 0 veth203f8d4: 3840797 22790 0 0 0 0 0 0 3087736 25776 0 0 0 0 0 0 veth5f190ab: 6088841 2559 0 0 0 0 0 0 4197331 3261 0 0 0 0 0 0 wlp3s0: 2452893965 2234780 0 0 0 0 0 0 670067679 985655 0 0 0 0 0 0 br-d85b89bb30a7: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 enp0s25: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 br-44d1bd312b90: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ifconfig
,ip
コマンド- 9章にて詳しく
ディスク
/proc/diskstats
7 0 loop0 60 0 270 88 0 0 0 0 0 0 0 7 1 loop1 414 0 1418 60 0 0 0 0 0 4 8 7 2 loop2 129 0 2258 64 0 0 0 0 0 4 20 7 3 loop3 492 0 1574 40 0 0 0 0 0 0 0 7 4 loop4 40 0 224 16 0 0 0 0 0 0 0 7 5 loop5 54 0 2078 36 0 0 0 0 0 0 0 7 6 loop6 169 0 2362 48 0 0 0 0 0 8 20 7 7 loop7 259 0 2562 24 0 0 0 0 0 4 4 8 0 sda 289448 19568 12629930 146392 1150141 1380128 34704434 2364768 0 574712 2516684 8 1 sda1 117 53 11384 140 2 0 2 0 0 112 140 8 2 sda2 289269 19515 12615250 146240 1101360 1380128 34704432 2298908 0 510340 2450476 7 8 loop8 174 0 2364 24 0 0 0 0 0 0 0 7 9 loop9 33 0 656 20 0 0 0 0 0 0 0 7 10 loop10 55 0 260 28 0 0 0 0 0 0 0 7 11 loop11 203 0 996 24 0 0 0 0 0 4 4 7 12 loop12 7714 0 17472 11368 0 0 0 0 0 436 10772 7 13 loop13 61 0 712 16 0 0 0 0 0 4 8 7 14 loop14 19 0 92 8 0 0 0 0 0 0 0 7 15 loop15 54 0 698 16 0 0 0 0 0 0 0 7 16 loop16 41 0 232 4 0 0 0 0 0 0 0 7 17 loop17 5 0 16 0 0 0 0 0 0 0 0
iostat -x
コマンドsysstat
パッケージに含まれる- ubuntu 18.04では入ってなかった
sudo apt install sysstat
-x Display extended statistics.
Linux 4.15.0-46-generic (wand-ThinkPad-X240s) 2019年04月07日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 20.87 0.09 4.48 0.22 0.00 74.35 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.47 0.00 0.00 2.25 0.00 0.00 0.00 loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.14 0.00 0.00 1.71 0.00 0.01 0.00 loop2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00 0.00 8.75 0.00 0.03 0.00 loop3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.08 0.00 0.00 1.60 0.00 0.00 0.00 loop4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.00 2.80 0.00 0.00 0.00 loop5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.67 0.00 0.00 19.24 0.00 0.00 0.00 loop6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.28 0.00 0.00 6.99 0.00 0.05 0.00 loop7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.09 0.00 0.00 4.95 0.00 0.02 0.00 sda 0.58 2.26 12.59 34.09 0.04 2.71 6.22 54.58 0.50 2.06 0.00 21.77 15.10 0.40 0.11 loop8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.14 0.00 0.00 6.79 0.00 0.00 0.00 loop9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.61 0.00 0.00 9.94 0.00 0.00 0.00 loop10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.51 0.00 0.00 2.36 0.00 0.00 0.00 loop11 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.12 0.00 0.00 2.45 0.00 0.02 0.00 loop12 0.02 0.00 0.02 0.00 0.00 0.00 0.00 0.00 1.47 0.00 0.00 1.13 0.00 0.06 0.00 loop13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.26 0.00 0.00 5.84 0.00 0.07 0.00 loop14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.42 0.00 0.00 2.42 0.00 0.00 0.00 loop15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.30 0.00 0.00 6.46 0.00 0.00 0.00 loop16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.10 0.00 0.00 2.83 0.00 0.00 0.00 loop17 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.60 0.00 0.00 0.00
- ディスクは
sda
のみ iowait
- 重要
- CPUがディスクに待たされた時間
await
- ディスクI/O待ち時間
%util
- ディスク使用率
- 100%以下に
iostat
Linux 4.15.0-46-generic (wand-ThinkPad-X240s) 2019年04月07日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 20.51 0.09 4.41 0.21 0.00 74.77 Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn loop0 0.00 0.00 0.00 135 0 loop1 0.00 0.00 0.00 709 0 loop2 0.00 0.00 0.00 1129 0 loop3 0.00 0.00 0.00 787 0 loop4 0.00 0.00 0.00 112 0 loop5 0.00 0.00 0.00 1039 0 loop6 0.00 0.00 0.00 1181 0 loop7 0.00 0.00 0.00 1281 0 sda 2.84 12.58 34.26 6424677 17494289 loop8 0.00 0.00 0.00 1182 0 loop9 0.00 0.00 0.00 328 0 loop10 0.00 0.00 0.00 130 0 loop11 0.00 0.00 0.00 498 0 loop12 0.02 0.02 0.00 8880 0 loop13 0.00 0.00 0.00 356 0 loop14 0.00 0.00 0.00 46 0 loop15 0.00 0.00 0.00 349 0 loop16 0.00 0.00 0.00 116 0 loop17 0.00 0.00 0.00 8 0
tps
: transfers per second- IOPS: I/O per secondとも
- 重要
- データの転送能力の増強が必要化どうかの判断
- 一般的なパフォーマンス問題の特定
ロードアベレージ (load)
- CPUに処理してもらうのを待っているプロセスの数
/proc/loadavg
0.23 0.50 0.90 2/1248 18404
uptime
コマンド
17:12:53 up 5 days, 21:53, 1 user, load average: 0.30, 0.49, 0.87
- CPUコアが1つのシステムで、ロードが1.0の場合、ぴったり1つのプロセスが待ち状態
- 高いからといって問題とは限らない
- 元気に動いていれば問題ない
- 代理指標(proxy metric)としては役立つ
- 異様に高い場合、他の問題を示唆する
SSL証明書
- 気づかないうちにSSL証明書が期限切れに
- どう防ぐ
SNMP: Simple Network Management Protocol
- ネットワーク監視に使うもの
- サーバ監視に使うな
- 機能追加が大変
- セキュリティが低い
- スケールや管理が難しい
- 集中型ポーリングの仕組みが必要(pullベース)
- pushベースのツール使え
- collectd
- Telegraf
- Diamond
Webサーバー
- Webアプリケーションにおいて最重要コンポーネントの一つ
- 秒間リクエスト数(request per second [req/sec])
- HTTPステータスコード
- Webサーバのリクエストログに記録される
- 5xxや4xxは売上に繋がらないレスポンス
- リクエスト時間
データベースサーバ
- コネクション数
- 秒間クエリ数(qps: queries per second)
- DBの忙しさのメトリクス
- スロークエリ
- レプリケーションの遅延
- IOPS
- DBは大量の読み書きを行う
- ので、ふつうIO律速になる
- 参考図書(O'Reilly)
- High Performance MySQL
- Database Reliability Engineering
ロードバランサ
- フロントエンドとバックエンドの2つのメトリクスを両方とれ
- ロードバランサが提供するヘルスチェックの仕組み
- L4
- 特定のポートに対するコネクションができるかどうか
- L7
- HTTP
- /healthエンドポイントパターンが使える
- L4
メッセージキュー
- 【補】時間のかかる処理を分離するのに使うやつ
- HTTP 202 Acceptedなどを返して、裏でせっせせっせと処理を行う
- pub-subシステムとも
- キューの長さ(queue length)
- 購読待ちメッセージ数
- 消費率(consumption rate)
- 時間あたりに購読されたメッセージ数
キャッシュ
- evicted items
- キャッシュから追い出されたアイテム数
- 多いとキャッシュ容量の増強が必要かもしれない
- hit/miss ratio (または cache-hit ratio)
- 高いと嬉しい
- これらは関連し合う
- 【補】キャッシュ容量を増強すると
- evicted itemsは下がる
- アイテムがいっぱい入るから
- hit/miss ratioは上昇する
- 入っているアイテムが増えるからヒット率も上がる
- evicted itemsは下がる
- 【補】キャッシュ容量を増強すると
DNS
- zone transfers(ゾーン転送)
- スレーブとマスタの同期
- qps
NTP
- 時刻同期がうまくいっていないと認証が通らなかったりする
- Kerberosとか
ntpstat
コマンドで正常に同期できているか判定できる- 終了コードで教えてくれるので監視に使いやすい
それ以外の企業インフラにおける監視
DHCP
- リースの利用状況
- リースプールのサイズ
SMTP
- 外向けのメールキュー
- 送受信メール総数
- 個々のユーザの受信箱のサイズ
- めっちゃ使ってる人の特定
スケジュールジョブの監視
- 「成功したら何かする」だと失敗に気づけない
- 失敗したときも何かする
- 「データが存在しない」状態を「データが存在する」状態に変える
run-backup.sh 2>&1 backup.log || echo "Job failed" > backup.log
- バックアップに失敗した時、
run-backup.sh
の標準エラー出力と"Job failed"をbackup.log
に書き込む - デッドマン装置(dead man's switch)
- 電車等で、運転士が運転中に死亡したとき暴走事故を防ぐやつ
- 転じて、ファイルのタイムスタンプを監視し、一定時間更新されていなければJob Failedとする
- ジョブ成功時に
touch
してタイムスタンプ更新する
- ジョブ成功時に
ロギング
収集
- syslog
- syslog管理外のログがあれば、それもsyslogに送るようにする
- ツールがsyslog管理外のログファイルの収集もサポートしているならそれも可
- いずれにせよ、一貫性のあること
UDP/TCP
保存
分析
- 分析すべき項目の例
- HTTPレスポンス
- sudoの使用
- SSHログイン
- cronジョブの結果
- MySQLやPostgreSQLのスロークエリ
- 分析ツール
- Splunk
- ELKスタック
- Elasticsearch
- Logstash
- Kibana
- SaaS