入門監視 ch8 サーバー監視

Linux勉強メモ監視

出典: 

  • 監視=システム管理者がやることと思われがち
  • とはいえ、実際サーバ上で色々なことが起きているのは確か

    • サーバレスアーキテクチャでも、プラットフォームを提供し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と取り合い)
        • 資料

メモリ

  • /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

      • 最近アクセスされた領域のファイルシステムメタデータ

        • ディレクトリのパーミッションや中身
  • システムのメモリを追加すべきかの判断には、-/+ buffers/cacheavailableを使う
  • /proc/meminfoの中身をそのまま出力し、自前で計算するツールもある
MemTotal:        8061240 kB
MemFree:         1250280 kB
MemAvailable:    3267104 kB
Buffers:          643300 kB
Cached:          1833608 kB
SwapCached:         2320 kB
...
  • Swap

    • スワップ領域
    • /swapパーティションを切ってあったりswapfileがあったりしたらそれ

      • 最近のクラウドインフラではあまり一般的でない
    • メモリ使用が増加 => freeが減り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証明書が期限切れに
  • どう防ぐ

    • ドメインレジストラや認証局(CA)の仕組みを使う
    • 外部向けなら、外部のサイト監視ツールで有効期限チェック・通知

      • Pingdom
      • StatusCake
    • 自分でつくる(shell scriptとか)

SNMP: Simple Network Management Protocol

  • ネットワーク監視に使うもの
  • サーバ監視に使うな

    • 機能追加が大変
    • セキュリティが低い
    • スケールや管理が難しい

      • 集中型ポーリングの仕組みが必要(pullベース)
  • pushベースのツール使え

    • collectd
    • Telegraf
    • Diamond

Webサーバー

  • Webアプリケーションにおいて最重要コンポーネントの一つ
  • 秒間リクエスト数(request per second [req/sec])

    • スループットの指標
    • コネクション数との違い

      • 今日ではTCPコネクションを閉じずに多くのHTTPリクエストを処理している

        • サーバ側: HTTP keep alive
        • ブラウザ側: persistent connection
      • ので、コネクション数 < リクエスト数
  • HTTPステータスコード

    • Webサーバのリクエストログに記録される
    • 5xxや4xxは売上に繋がらないレスポンス
  • リクエスト時間

データベースサーバ

  • コネクション数

    • MySQLでは「スレッド数」
    • 全体のトラフィックレベルのメトリクス
  • 秒間クエリ数(qps: queries per second)

    • DBの忙しさのメトリクス
  • スロークエリ
  • レプリケーションの遅延
  • IOPS

    • DBは大量の読み書きを行う
    • ので、ふつうIO律速になる
  • 参考図書(O’Reilly)

    • High Performance MySQL
    • Database Reliability Engineering

ロードバランサ

  • フロントエンドとバックエンドの2つのメトリクスを両方とれ
  • ロードバランサが提供するヘルスチェックの仕組み

    • L4

      • 特定のポートに対するコネクションができるかどうか
    • L7

      • HTTP
      • /healthエンドポイントパターンが使える

メッセージキュー

  • 【補】時間のかかる処理を分離するのに使うやつ

    • HTTP 202 Acceptedなどを返して、裏でせっせせっせと処理を行う
  • pub-subシステムとも
  • キューの長さ(queue length)

    • 購読待ちメッセージ数
  • 消費率(consumption rate)

    • 時間あたりに購読されたメッセージ数

キャッシュ

  • evicted items

    • キャッシュから追い出されたアイテム数
    • 多いとキャッシュ容量の増強が必要かもしれない
  • hit/miss ratio (または cache-hit ratio)

    • 高いと嬉しい
  • これらは関連し合う

    • 【補】キャッシュ容量を増強すると

      • evicted itemsは下がる

        • アイテムがいっぱい入るから
      • hit/miss ratioは上昇する

        • 入っているアイテムが増えるからヒット率も上がる

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

  • TCPがよい

    • UDPはメッセージが消えてしまうことがある
    • UDPは「最期の言葉」を送ることが出来る点で有利だが、役に立つことは少ない

保存

  • syslogサーバーに送ってgrepとかで分析するのは駄目

    • どうせ誰も活用しない
  • ログ管理システムに送ろう

    • SaaS
    • オンプレ

分析

  • 分析すべき項目の例

    • HTTPレスポンス
    • sudoの使用
    • SSHログイン
    • cronジョブの結果
    • MySQLやPostgreSQLのスロークエリ
  • 分析ツール

    • Splunk
    • ELKスタック

      • Elasticsearch
      • Logstash
      • Kibana
    • SaaS

まとめ

  • トピック

    • 標準的なOSメトリクスはアラートを送るのには適さないことがある理由と、それらの効果的な使い方
    • Webサーバ、データベースサーバ、ロードバランサなどといった、よく使うサービスの監視方法
    • サーバの観点からのロギング
  • 次章、SNMPとネットワーク監視

    • 信頼性は結局ネットワークがボトルネックになる