【障害対応】Linuxサーバ一次切り分けコマンド
サーバで障害が発生した場合、まずはOSレベルでの切り分けを行います。
このとき、チームメンバの誰でも対応ができるよう、あらかじめ実行するコマンドとその確認箇所をマニュアルとして準備しておくことが大切です。
以下は、RHEL7系Linuxの障害発生時に、一次切り分けで使用するコマンドです。
全て一般ユーザで実行できるので、Linuxの操作に不慣れな作業者でもタイプミスを気にせずに実行できると思います。
Contents
ログイン対象サーバのホスト名確認
ログインしたサーバのホスト名を確認し、作業を実施しようとしている対象に間違いが無いことを確認します。
$ 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に問題が発生します。
下記表示のうち、使用%
がパーティションごとのディスク使用率を表します。一番左のファイルシス
列がdevtmpfs
やtmpfs
で始まるものはデバイスファイル領域や一時領域なので、それ以外の容量を確認します。
$ 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使用率を表します。一番左のファイルシス
列がdevtmpfs
やtmpfs
で始まるものはデバイスファイル領域や一時領域なので、それ以外の容量を確認します。
$ 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 :::*