【障害対応】Linuxサーバ一次切り分けコマンド

サーバで障害が発生した場合、まずはOSレベルでの切り分けを行います。
このとき、チームメンバの誰でも対応ができるよう、あらかじめ実行するコマンドとその確認箇所をマニュアルとして準備しておくことが大切です。

以下は、RHEL7系Linuxの障害発生時に、一次切り分けで使用するコマンドです。
全て一般ユーザで実行できるので、Linuxの操作に不慣れな作業者でもタイプミスを気にせずに実行できると思います。

ログイン対象サーバのホスト名確認

ログインしたサーバのホスト名を確認し、作業を実施しようとしている対象に間違いが無いことを確認します。

$ hostname
web01.densan-hoshigumi.com

時刻ずれ確認

サーバ内の時刻を表示し、実際の時刻にずれがないか確認します。ずれている場合、以降ログを確認する場面で、タイムスタンプから時刻ずれ分を加味して読み替えます。

$ date
2018年 10月 30日 火曜日 18:40:58 JST

ログインユーザ履歴確認

サーバへログインしたユーザの履歴を確認します。障害発生直前にログイン履歴があれば、作業影響に起因した障害の可能性があります。
大量に結果が表示されるので、headコマンドへ出力結果をパイプして最新の10行を表示させています。
左から、ログインユーザ、仮想端末名、ログイン元IPアドレス、ログイン日時(期間)を示しています。
ユーザ名がrebootの行は、再起動した時刻を示しています。

$ last | head
user01   pts/0        192.168.56.1     Tue Oct 30 15:38   still logged in
user01   pts/0        192.168.56.1     Tue Oct 30 14:06 - 15:37  (01:31)
root     tty1                          Tue Oct 30 14:05   still logged in
reboot   system boot  3.10.0-862.el7.x Tue Oct 30 14:04 - 15:41  (01:36)
root     tty1                          Tue Oct 30 14:03 - 14:04  (00:00)
user01   tty1                          Tue Oct 30 14:03 - 14:03  (00:00)
reboot   system boot  3.10.0-862.el7.x Tue Oct 30 14:02 - 14:04  (00:02)
user01   tty1                          Tue Oct 30 10:38 - 10:38  (00:00)
reboot   system boot  3.10.0-862.el7.x Tue Oct 30 10:36 - 10:38  (00:01)

起動時間、ロードアベレージ確認

OSが起動してからの経過時間を確認し、再起動形跡の有無を判断します。最初のカンマ区切りまでが<現在時刻> up <OS起動後の経過時間>を示しています。下記の例では、最後に起動した時刻は、15:45:44 - 1:44 = 15:44:00となります。

また、uptimeコマンドではロードアベレージも確認できます。。load average: <1分間平均>, <5分間平均>, <15分間平均>で各ロードアベレージの平均値から、慢性的に高負荷状態が継続していないか確認します。
一般的に、ロードアベレージがCPUのコア数を超えている場合は処理が追いついていない可能性があります。

$ uptime
 15:45:44 up  1:44,  2 users,  load average: 0.00, 0.01, 0.05

CPUの高負荷状態が継続している場合、どのプロセスがCPUリソースを消費しているか確認します。原因となっているプロセスのチューニングや、場合によってはサーバのスペック増強を検討する必要があります。
下記表示では、カーネルスレッドのkworkerが若干CPUを使用しているものの、慢性的にCPUリソースを消費しているプロセスは無いことがわかります。

$ ps auxk -%cpu | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     18072  1.3  0.0      0     0 ?        S    13:07   0:05 [kworker/u30:2]
root         1  0.0  0.1  19648   804 ?        Ss   Jul17   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jul17   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jul17   0:07 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    Jul17   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S<   Jul17   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    Jul17   1:56 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    Jul17   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    Jul17   0:00 [migration/0]

メモリ/スワップ空き容量確認

メモリ/スワップ消費量について確認します。
下記表示のうち、Mem行のtotal列がメモリ容量の合計値で、available列が空きメモリ容量です。available列が極端に少ない場合、プロセスがメモリを使い切りスワップ領域を使用し始めます。ディスクアクセスがボトルネックとなって処理が遅延している可能性があります。
スワップ空き容量はSwap行のfreeで確認します。メモリとともにスワップも枯渇すると、OSの動作が不安定になる可能性があります。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           991M         98M        747M        6.7M        146M        735M
Swap:          819M          0B        819M

メモリ/スワップ空き容量が枯渇している場合、どのプロセスがメモリを消費しているのか確認します。原因となっているプロセスのチューニングや、場合によってはサーバのスペック増強を検討する必要があります。
下記表示では、nginxユーザで実行しているphp-fpmプロセスが複数生成され、メモリが逼迫していることがわかります。

$ ps auxk -rss | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
nginx     3255  0.0 11.2 465276 56544 ?        S    Jul17  15:09 php-fpm: pool www
nginx     3728  0.0  8.6 457944 43524 ?        S    Jul17  15:02 php-fpm: pool www
nginx    31890  0.0  8.3 460216 41852 ?        S    Aug15  12:22 php-fpm: pool www
nginx    32363  0.0  7.6 458956 38160 ?        S    Aug03  13:07 php-fpm: pool www
nginx     3253  0.0  6.7 459844 33860 ?        S    Jul17  15:04 php-fpm: pool www
nginx    31891  0.0  6.2 456256 31488 ?        S    Aug15  12:22 php-fpm: pool www
nginx     3256  0.0  5.8 460704 29520 ?        S    Jul17  15:06 php-fpm: pool www
nginx     3254  0.0  5.7 458516 28900 ?        S    Jul17  15:04 php-fpm: pool www
nginx    10147  0.0  5.0 460456 25084 ?        S    Aug07  12:53 php-fpm: pool www

ディスク使用率確認

ディスク消費量を確認します。ディスクが溢れていると、プロセスからのデータ書き込みができず、アプリケーションやOSに問題が発生します。
下記表示のうち、使用%がパーティションごとのディスク使用率を表します。一番左のファイルシス列がdevtmpfstmpfsで始まるものはデバイスファイル領域や一時領域なので、それ以外の容量を確認します。

$ df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.2G  978M  5.3G   16% /
devtmpfs                  485M     0  485M    0% /dev
tmpfs                     496M     0  496M    0% /dev/shm
tmpfs                     496M  6.8M  490M    2% /run
tmpfs                     496M     0  496M    0% /sys/fs/cgroup
/dev/sda1                1014M  129M  886M   13% /boot
tmpfs                     100M     0  100M    0% /run/user/0
tmpfs                     100M     0  100M    0% /run/user/1000

i-node消費量確認

i-node消費量を確認します。ディスク容量に余裕があるにも関わらずファイルの書き込みが出来ない場合は、i-nodeが枯渇している可能性があります。
下記表示のうち、I使用%がパーティションごとのi-node使用率を表します。一番左のファイルシス列がdevtmpfstmpfsで始まるものはデバイスファイル領域や一時領域なので、それ以外の容量を確認します。

$ df -ih
ファイルシス            Iノード I使用 I残り I使用% マウント位置
/dev/mapper/centos-root    3.1M   26K  3.1M     1% /
devtmpfs                   122K   343  121K     1% /dev
tmpfs                      124K     1  124K     1% /dev/shm
tmpfs                      124K   448  124K     1% /run
tmpfs                      124K    16  124K     1% /sys/fs/cgroup
/dev/sda1                  512K   326  512K     1% /boot
tmpfs                      124K     1  124K     1% /run/user/0
tmpfs                      124K     1  124K     1% /run/user/1000

ネットワークインターフェース確認

物理サーバの場合、NICにLANケーブルが正常に接続されているか確認します。
DEVICE列がNIC名称で、STATE列で接続状態を確認できます。

$ nmcli device
DEVICE  TYPE      STATE     CONNECTION
enp0s3  ethernet  接続済み  enp0s3
enp0s8  ethernet  接続済み  enp0s8
lo      loopback  管理無し  --

ログファイルを確認することで、過去のLinkDown/Up履歴も確認します。

$ journalctl -k | grep Link
10月 30 15:37:53 web01.densan-hoshigumi.com kernel: e1000: enp0s3 NIC Link is Down
10月 30 15:37:53 web01.densan-hoshigumi.com kernel: e1000: enp0s8 NIC Link is Down
10月 30 15:37:57 web01.densan-hoshigumi.com kernel: e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
10月 30 15:37:57 web01.densan-hoshigumi.com kernel: e1000: enp0s8 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX

サービス起動状態確認

該当サーバで設計上起動しているはずのサービス(プロセス)の状態をsystemctl status <サービス名>で確認します。Webサーバならhttpd、SMTPサーバならpostfixといった具合です。
下記表示では、httpdのサービス状態を表示させています。Active行がactive (running)となっていれば、正常に起動しています。

$ systemctl status httpd
systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2018-10-30 16:08:09 JST; 3s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 9093 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           tq9093 /usr/sbin/httpd -DFOREGROUND
           tq9094 /usr/sbin/httpd -DFOREGROUND
           tq9095 /usr/sbin/httpd -DFOREGROUND
           tq9096 /usr/sbin/httpd -DFOREGROUND
           tq9097 /usr/sbin/httpd -DFOREGROUND
           mq9098 /usr/sbin/httpd -DFOREGROUND

10月 30 16:08:09 web01.densan-hoshigumi.com systemd[1]: Starting The Apache HTTP Server...
10月 30 16:08:09 web01.densan-hoshigumi.com httpd[9093]: AH00558: httpd: Could not reliably determine the server's fully qualifie...ssage
10月 30 16:08:09 web01.densan-hoshigumi.com systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

ポートリッスン状態確認

前述のサービスについて、外部からの通信を受け付けるためL4ポートがリッスン状態になっているかss -an | grep ":<ポート番号>"で確認します。Webサーバならtcp/80、SMTPサーバならtcp/25といった具合です。
下記表示では、httpdで使用しているtcp/80ポートについて、リッスン状態(LISTEN)で待ち受けているか確認しています。

$ ss -an | grep ":80"
tcp    LISTEN     0      128      :::80                   :::*

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です