HEARTBEATS

ハートビーツの監視チームはアラート対応で何を見ているのか

   

こんにちは。 運用グループ所属の安藤です。

私の所属する運用グループでは主にサーバーの監視業務を行っており、アラートが発生したら対象のサーバーにログインして状況を確認します。状況確認のために行う様々なことの中に、社内で「基本コマンド」と呼ばれている5種類のコマンドの確認があります。今回は監視業務においてそれらの基本コマンドをどのように使用してアラート状況を把握しているかを紹介します。

基本コマンド

弊社で使用している基本コマンドは以下の5種類です。 アラート対応でサーバーにログインした際に最初に必ず実行します。

  • w コマンド
  • ps コマンド
  • top コマンド
  • vmstat コマンド
  • netstat/ss コマンド

監視業務における基本コマンドの使い方

ここでは監視業務で各基本コマンドをどのように使っているのか具体的に紹介します。本記事ではコマンド実行結果の確認ポイントにフォーカスし、コマンドの操作やオプションの解説は割愛します。各基本コマンドのオプションはmanコマンドやWeb検索で簡単に確認できますので、ぜひ調べてみてください。

なお、各コマンドの実行結果は、AlmaLinux OS 8.5のサーバーでの実行結果を参考に作成・記載しています。他の環境では多少異なる実行結果となる可能性があるのでご注意ください。

w コマンド

サーバーの負荷状況やログインユーザを表示するコマンドです。

監視業務においては、オプションは指定せずに実行します。

$ w

コマンドの実行結果は以下になります。

[my-user@hostname ~]$ w
 16:18:58 up 378 days,  1:17, 13 users,  load average: 0.05, 0.03, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user_1   pts/0    10.0.0.10        Mon22   17:30m  0.07s  0.05s -bash
user_2   pts/1    10.0.0.10        12:22    3:00   0.04s  0.00s -bash
my_user  pts/2    10.0.0.12        15:00    1.00s  0.04s  0.00s w

● 本コマンドの確認ポイント

サーバーが再起動されていないか
上記のup 378 days, 1:17の部分から、サーバーの稼働時間を確認します。上記の例の場合、サーバーは378日と1時間17分の間、再起動なしに稼働し続けていることがわかります。サーバーが起動された直後の場合は1 minのようにサーバーの稼働時間が数分前と表示されます。

特にサーバーとの疎通が取れない旨のアラートが発生した場合に確認が必要となる箇所です。サーバーが再起動された影響で疎通が取れなかったのか、その他の原因で疎通が取れなかったのかを切り分けられます。

ロードアベレージが増加傾向か減少傾向か
load average: 0.05, 0.03, 0.00の部分から、ロードアベレージがどれくらい高いかを確認できます。ロードアベレージとは一定時間内での実行中プロセス数と実行待ちプロセス数の合計の平均値で、サーバーの負荷状況を大まかに把握するのに役立ちます。3つの数値がカンマで区切られており、左から順に 1分平均値・5分平均値・15分平均値 となります。

以下のように、5分平均値や15分平均値と比較して1分平均値が高い場合、数分前より負荷が高い可能性が高いです。

load average: 15.00, 1.00, 1.00

以下のように、1分平均値が低いが5分平均値と15分平均値のいずかもしくは両方が高い場合、数分前よりも負荷が減少傾向である可能性が高いです。

load average: 1.00, 15.00, 10.00

直近で作業をしているユーザはいないか
USER列からユーザ名、IDLE列から無操作時間がわかります。上記の例の場合、user_1ユーザの無操作時間は17時間30分で、user_2ユーザの無操作時間が3分であることがわかります。また、WHAT列からはそのユーザが実行中のコマンドを確認できます。

無操作時間の短いユーザがいる場合、直近で何らかの作業を実施していた可能性があります。アラートが発生したサーバーに無操作時間の短いユーザがいれば、そのユーザの作業影響でアラートが発生した可能性を疑います。何らかのコマンドを実行中のユーザがいる場合でも同様です。

不審なユーザがいないか
FROM列からはユーザの接続元IPアドレスまたはFQDNを確認できます。

覚えのない接続元のユーザがいる場合、不正アクセスの可能性があるので、該当ユーザのログインプロセスの停止や接続元の遮断を検討します。

ps コマンド

実行中のプロセスを表示するコマンドです。

監視業務においては、オプションを含めて以下のように実行します。

$ ps aufxww

コマンド実行結果は以下になります。なお、psコマンドの実行結果は非常に長くなるため、一部を抜粋して記載しています。

[my-user@hostname ~]$ ps aufxww
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         750  0.0  0.0  70232   184 ?        Ssl   2022   3:46 /sbin/auditd
chrony       805  0.0  0.0 149116   672 ?        S     2022   0:06 /usr/sbin/chronyd
root         824  0.0  0.0  92796  1936 ?        Ss    2022  18:17 /usr/lib/systemd/systemd-logind
root         851  0.0  0.0 599676  2760 ?        Ssl   2022   7:13 /usr/sbin/NetworkManager --no-daemon
root      818919  0.0  0.0 246728  1696 ?        Ss   Feb15   0:28 /usr/sbin/crond -n -m off
root      578363  0.0  0.1 335900  6528 ?        S    16:50   0:00  \_ /usr/sbin/CROND -n -m off
root      578366  0.0  0.0 221360  1068 ?        R    16:50   0:00      \_ /root/bin/my_script.sh
root         990  0.0  0.1 366212  3792 ?        Ss    2022   7:21 /usr/sbin/httpd -DFOREGROUND
apache   4166375  0.0  0.1 618492  5552 ?        Sl   Mar19   0:34  \_ /usr/sbin/httpd -DFOREGROUND
apache   4166470  0.0  0.1 421812  6036 ?        Sl   Mar19   0:27  \_ /usr/sbin/httpd -DFOREGROUND
apache   4166509  0.0  0.1 421812  5412 ?        Sl   Mar19   0:27  \_ /usr/sbin/httpd -DFOREGROUND 

● 本コマンドの確認ポイント

直近で起動しているプロセスがないか
TIME列でプロセスの起動日時を確認できます。上記の実行例の場合、my_script.shが16:50に実行されていることがわかります。現在時刻が16:50に近い場合、そのプロセスは直近で起動したことがわかります。

また、上記の実行例にてプロセスがツリー形式で表示されることも確認できます。子プロセスは必ず親プロセスから実行されます。上記の実行例の場合、my_script.shの親プロセスはcrondであることがわかります。

監視業務においては、直近で起動したプロセスを把握することで、発生したアラートとの関連を疑えます。

ステータスに偏りがないか
STAT列でプロセスのステータスを確認できます。特によく確認するステータスは以下のとおりです。

  • S:スリープ状態のプロセス
  • R:実行中、またはCPUが使用可能になり次第実行されるプロセス
  • D:割り込み不可能なスリープ状態のプロセス。多くの場合、ディスクI/Oの処理の完了を待っている

監視業務では、主にR,D,Zのステータスのプロセスが多くないか確認します。RはCPUで処理を実行中もしくは実行待ちのプロセスであるため、そのプロセスがCPU負荷上昇の原因となります。DはI/O処理を行っているプロセスで、特にディスクI/Oが発生中である場合が多いため、そのプロセスがディスクI/O負荷上昇の原因となる可能性が高いです。wコマンドの結果からロードアベレージが高いことが分かっていれば、R,Dステータスのプロセスを確認することで原因となっているプロセスの目星をつけられます。

top コマンド

各プロセスの実行状況を表示するコマンドです。各種項目別にソートして表示できるため、CPU使用率の高いプロセスやメモリ使用率の高いプロセスを特定する際に役立ちます。

監視業務においては、オプションを含めて以下のように実行します。

$ top -cd1

コマンド実行結果は以下になります。なお、topコマンドの実行結果は長くなるため、一部を抜粋して記載しています。

[my-user@hostname ~]$ top -cd1
top - 17:22:51 up 120 days,  6:07,  1 user,  load average: 0.62, 0.69, 0.77
Tasks: 208 total,   4 running, 204 sleeping,   0 stopped,   0 zombie
%Cpu(s): 49.8 us,  2.3 sy,  0.0 ni, 46.7 id,  0.0 wa,  1.1 hi,  0.0 si,  0.0 st
MiB Mem :   3688.6 total,   1724.1 free,   1334.1 used,    630.3 buff/cache
MiB Swap:   4096.0 total,   2341.6 free,   1754.4 used.   1954.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
3924534 root      20   0  485680 247140   1804 S  99.2   6.5  13037:16 /root/bin/my_script.sh
    861 root      20   0  123396  31728   4816 S   1.3   0.8 736:37.12 /usr/local/hb-agent/bin/happo-agent daemon
 583778 my-user   20   0  275376   5448   4500 R   0.8   0.1   0:00.13 top -c
4166668 apache    20   0  421812   5532   4148 S   0.6   0.1   0:27.51 /usr/sbin/httpd -DFOREGROUND

● 本コマンドの確認ポイント

CPU使用率やメモリ使用率の高いプロセスがないか
%CPU列にはCPU使用率、%MEM列にはメモリ使用率、COMMAND列には実行されているコマンドが表示されます。topコマンドは指定した列を降順で表示できるため、CPUやメモリ使用率の高いプロセスを特定する際に役立ちます。上記の実行例ではCPU使用率の高い順にソートしているため、もっともCPU使用率の高いプロセスはmy_script.shであることがわかります。

異常にCPU使用率やメモリ使用率の高いプロセスがあればプロセス再起動を検討します。インターネットからの接続があるようなプロセス(sshdやhttpd等)のCPU使用率が高い場合は、そのプロセスのログからインターネットからの攻撃かどうかを判断し、必要に応じて接続元を遮断します。

vmstat コマンド

CPU、ディスクI/O、メモリ等の状況を指定秒数間隔で表示できるコマンドです。

監視業務においては、オプションを含めて以下のように実行します。

$ vmstat 1 -w

コマンド実行結果は以下になります。なお、本コマンドで表示される結果は基本的に各行の出力時点の状況ですが、コマンド実行直後の1行目の結果のみサーバー起動後からの統計情報です。今現在の状況を確認したい場合は、2行目以降を確認します。

[my-user@hostname ~]$ vmstat 1 -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 0  0       744960      1188992           16       668852    0    0    16    40    1    0   5   2  94   0   0
 0  0       744960      1173716           16       668696    0    0     0    16 1410 3800  36  11  54   0   0
 1  0       744960      1190300           16       668808    0    0     0   260 1050 3275  35  11  53   1   0
 0  0       744960      1190976           16       668760    0    0     0   124  226  947  18   3  79   0   0
 1  0       744960      1190724           16       668744    0    0     0    85  125  995  11   2  86   0   0

● 本コマンドの確認ポイント

サーバー負荷の原因はCPU負荷かディスクI/O負荷か
procsr列からはRステータスであるプロセスの合計数、b列からはDステータスであるプロセスの合計数を確認できます。

wコマンドのロードアベレージの確認結果と併せて、負荷の原因の大まかな切り分けを行います。

CPU負荷の原因は何か
cpuには単位時間におけるCPU使用時間が分類ごとに割合で表示されます。各列は以下の内容を表しています。

  • us:一般的なプログラムの実行にCPUを使用した時間(user)
  • sy:OS側の処理にCPUを使用した時間(system)
  • id:アイドル時間(idle)
  • wa:I/O処理(多くの場合ディスクI/O処理)を待っていた時間(iowait)
  • st:仮想化環境において、要求したCPUリソースが割り当てられず使用できなかった時間(steal)

waが高い場合、ディスクI/O処理の時間が長い可能性が高いため、ディスクI/O負荷が高い可能性があります。

stは要求したCPUリソースが仮想化基盤※1側から割り当てられなかった場合に増加します。例えば、仮想化基盤のCPUリソース100%のうち仮想マシンAが80%のCPUリソースを使用していると、仮想マシンBが40%のCPUリソースを要求しても不足分の20%分は使用できないことになります。この20%がCPU Stealです。一般的な仮想化基盤であれば、CPU Stealは仮想化基盤側の問題である可能性があります。CPU Stealはシステムのパフォーマンス低下を招くため、仮想化基盤の変更やクラウドベンダー等への問い合わせをします。

AWSの場合、T系インスタンス※2のCPUクレジットが枯渇した状態でベースラインCPU使用率を超過するとstが増加します。そのため、対応としてインスタンスタイプの変更やUnlimitedモードの有効化を検討します。

仮想化基盤とは、仮想マシンが実際に動く物理サーバーなどで構成される実体の環境のことで、クラウドにおける仮想マシンなども仮想化基盤上で動いています。

T系ファミリーインスタンスにはベースラインのCPU使用率というものが決められており、そのCPU使用率を超過するとバーストという状態になります。バースト時はCPUクレジットを消費することで、ベースライン以上のパフォーマンスを出すことができます。しかし、CPUクレジットが枯渇するとバーストできなくなり、ベースライン以上のCPUを使用できなくなります。

スラッシングが発生していないか
procsb列やcpuwa列の値が高い場合、swapsi列とso列からスワップ※3の状態も確認する必要があります。siはスワップイン、soはスワップアウトを表します。

スワップアウトは物理メモリ上に記憶されているデータをディスク上に退避すること、スワップインはディスク上に退避していたデータを物理メモリ上に戻すことを指します。いずれの処理もディスクI/Oが発生するため、多発するとパフォーマンスの低下を招きます。この状態をスラッシングといいます。sisoが高い場合は、スラッシングが発生している可能性があります。物理メモリが不足している可能性があるため、物理メモリ使用率の高いプロセスの停止や物理メモリ増設を検討します。

スワップは物理メモリ上に記憶されているデータをディスク上に退避する処理のことで、主に物理メモリの空きが不足しているか、もしくは空き領域が断片化していることが原因でまとまったメモリ領域を確保できないときに発生します。すでに物理メモリ上に記憶されているデータをディスク上に退避することでまとまった物理メモリの空き領域を確保します。

netstat/ssコマンド

netstatとssはいずれもコネクションの状態を確認をするコマンドです。 ssコマンドはnetstatコマンドの代わりとして今後置き換わっていくコマンドです。確認できる内容はほとんど同じであるため、代表としてnetstatコマンドを紹介します。netstatコマンドがインストールされていない場合は、dnfコマンドを使ってnet-toolsパッケージをインストールしてください。

監視業務においては、オプションを含めて以下のように実行します。一般ユーザ権限でコマンドを実行すると情報が全て表示されないため、root権限でコマンドを実行する必要があります。

$ sudo netstat -anpt

ssコマンドも同様のオプションで同様の出力を得られます。

$ sudo ss -anpt

コマンド実行結果は以下になります。なお、netstatコマンドの実行結果は長くなるため、一部を抜粋して記載しています。

[my-user@hostname ~]$ sudo netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      990/httpd
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      3450299/unbound
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1272/sshd
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      990/httpd
tcp        0      0 10.19.0.10:33084        XXX.XXX.XXX.XXX:80      TIME_WAIT   -
tcp        0      0 10.19.0.10:443          XXX.XXX.XXX.XXX:53763   ESTABLISHED 2071/httpd
tcp        0      0 10.19.0.10:443          XXX.XXX.XXX.XXX:59844   ESTABLISHED 2050/httpd
tcp        0      0 10.19.0.10:33126        XXX.XXX.XXX.XXX:80      TIME_WAIT   -
tcp        0      0 10.19.0.10:33143        XXX.XXX.XXX.XXX:6777    TIME_WAIT   -
tcp        0      0 10.19.0.10:33013        XXX.XXX.XXX.XXX:80      TIME_WAIT   -
tcp        0      0 10.19.0.10:33119        XXX.XXX.XXX.XXX:6777    TIME_WAIT   -
tcp        0      0 10.19.0.10:33014        XXX.XXX.XXX.XXX:80      TIME_WAIT   -

● 本コマンドの確認ポイント

特定のIPアドレスからのコネクションが多くないか
Foreign Address列から、本サーバーに接続しているIPアドレスを確認できます。

特定のIPアドレスから多数の接続がある場合、インターネットからの攻撃の疑いがあります。PID/Program列から接続先のプロセスを特定し、場合によっては遮断を実施します。

おわりに

本記事では、弊社で監視業務に使用している基本コマンドについて、どのようなポイントをチェックしているかを解説しました。実際の業務では各種ログやリソースグラフも確認しますので、今回ご紹介した内容はアラート対応のごく一部となりますが、サーバー運用における状況確認の参考になれば幸いです。

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事