[知識の整理] 障害対応時によく使うコマンド

# はじめに
　学習意欲を奮い立たせるため、blog更新を再開しようと思います。
とりあえずアウトプットすることが大切ということで、障害対応時の調査手順などを整理してみたいと思います。
そのため、目新しいものは何一つありませんこと、ご了承下さい。mm

## ■環境
　基本的に、私の検証環境(amzn linux)で試したものを記載しています。

```bash
[ec2-user@mitzi_dev ~]$ uname -r
3.14.33-26.47.amzn1.x86_64
```

# 01. 負荷系(CPU, load avg)
## 01-1. load avg (処理待ちのプロセス平均数)

```bash
[ec2-user@mitzi_dev ~]$ cat /proc/loadavg
0.00 0.01 0.05 1/111 10281

[ec2-user@mitzi_dev ~]$ w
 21:27:24 up 375 days,  4:40,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
ec2-user pts/0    xxx.xxx.xxx.xxx  20:54    4.00s  0.01s  0.00s w

[ec2-user@mitzi_dev ~]$ top d 2
top - 21:42:08 up 375 days,  4:55,  1 user,  load average: 0.00, 0.01, 0.05
(省略)

など
```
■備考
　load avgの適正値としてCPUコア数で割って1以下が良いという考え方があるようですが、状況によって異なるとの話もあるようです。ちなみにコア数の調べ方は下記

```bash
[ec2-user@mitzi_dev ~]$ nproc
1

[ec2-user@mitzi_dev ~]$ cat /proc/cpuinfo | grep -c processor
1
```

## 01-2. CPU Utilization

```bash
▽CPU使用率の確認
[ec2-user@mitzi_dev ~]$ top d 2
top - 21:42:08 up 375 days,  4:55,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  92 total,   1 running,  91 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
(省略)
※ デフォルトCPU使用率で降順となっている
→　Cpu(s)欄より　%us: ユーザプロセス、 %sy: システムプロセスなど、負荷の内訳が表示されている。
→ vmstat の CPU欄でも同様

▽CPU使用率の高いプロセスの確認
→ CPU使用率、MEM使用率順にソートして、上位5つを表示している
[ec2-user@mitzi_dev ~]$ ps aux | sort -rk 3,4 | head -n 5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache    7255  0.0  9.5 489884 97400 ?        S    03:15   0:00 /usr/sbin/httpd
apache    7257  0.0  9.0 484112 91928 ?        S    03:15   0:00 /usr/sbin/httpd
apache    7625  0.0  7.4 460432 75712 ?        S    05:17   0:00 /usr/sbin/httpd
apache    7624  0.0  7.4 460432 75728 ?        S    05:17   0:00 /usr/sbin/httpd

```

# 02. メモリ関連(メモリ不足、swap、buffer/cache)
## 02-1. メモリ不足
```bash
・基本
[ec2-user@mitzi_dev ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:           996        852        143          0        119        124
-/+ buffers/cache:        608        387
Swap:            0          0          0
→　まずfree(空きメモリ)の値を見るが、「buffers/cache」(ページキャッシュ)のfreeも物理メモリ量として換算出来るためそちらも考慮した上、メモリ利用状況を判断する必要がある。
※ 話が飛ぶが、Nagiosの標準plug-inではMemのfree値を見て判定しているため、正確とは言えない。

→ 例ではswap領域を定義していないため値が出ていませんが、swapのfreeが少なくなると
'OOM Killer' や 'Out Of Memory' が発生し、メモリを確保するためwebサーバなどのプロセスが強制終了される恐れがあるため注意が必要です。
swapの空き容量を監視することが大事と思われます。

$ topコマンド 
(shift + m)でメモリ使用率での降順となる


・メモリ使用率 = RSS(Resident Set Size)の多いプロセスをピックアップ
　[ec2-user@mitzi_dev ~]$ ps aux --sort -rss | head -n 5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache    7255  0.0  9.5 489884 97400 ?        S    03:15   0:00 /usr/sbin/httpd
apache    7257  0.0  9.0 484112 91928 ?        S    03:15   0:00 /usr/sbin/httpd
apache    7393  0.0  7.4 460448 75828 ?        S    03:49   0:00 /usr/sbin/httpd
apache    7625  0.0  7.4 460432 75748 ?        S    05:17   0:00 /usr/sbin/httpd


[ec2-user@mitzi_dev ~]$ cat /proc/meminfo
(省略)

```

## 02-2. SWAP消費プロセスの確認

```bash
・swap消費量の多いプロセス(PID)の上位5つを表示
※ `/proc/[PID]/status` となっており、ここでは該当プロセスのPIDを特定している。
※ 私の環境ではswap領域を定義していないため、下記のような表示となっています。
[ec2-user@mitzi_dev ~]$ grep VmSwap /proc/*/status | sort -k 2 -r | head -n 5
/proc/self/status:VmSwap:	       0 kB
/proc/7642/status:VmSwap:	       0 kB
/proc/7625/status:VmSwap:	       0 kB
/proc/7624/status:VmSwap:	       0 kB
/proc/7623/status:VmSwap:	       0 kB
```

# 03. ディスク関連(容量不足、inode枯渇)
## 03-1. 容量不足
```bash
・状態確認
[ec2-user@mitzi_dev ~]$ date; df -h
2017年  6月 13日 火曜日 22:18:47 JST
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1        20G  4.7G   15G   24% /
devtmpfs         491M   56K  491M    1% /dev
tmpfs            499M     0  499M    0% /dev/shm

・主な要因調査　(例: ルートディスク配下が不足していた場合)
[ec2-user@mitzi_dev ~]$ sudo du -sh /* | grep G | sort -nr
2.5G	/usr
1.2G	/home
※この方法ですとアクセス出来ないディレクトリ情報が出ます。もっとスマートな調査方法調べておきます。。

・上記の結果を元に/usr配下を検索(これを繰り返す)
[ec2-user@mitzi_dev ~]$ sudo du -sh /usr/* | grep G | sort -nr | head -n 5
1.1G	/usr/local


▽その他
・ファイル単位でディスク使用量の高いものをピックアップ
[ec2-user@mitzi_dev ~]$ sudo du -h /* | sort -nr | head -n 5
1020K	/usr/share/zabbix/locale/el/LC_MESSAGES
1020K	/usr/share/pki/ca-trust-source
1020K	/usr/share/gettext/intl
1020K	/usr/local/src/ffmpeg/libswscale/x86
1020K	/usr/lib64/python2.6/site-packages/Crypto/SelfTest
```

## 03-2. inode枯渇
### ■　inodeとは
・IT用語辞典より
http://e-words.jp/w/inode.html
> inodeとは、UNIX系OSの一部のファイルシステムで用いられる、ファイルやディレクトリについての情報を記録した管理データのこと。

> inodeは一つ一つのファイルやディレクトリごとに作成され、各inodeには装置内で固有(一意)の整数値(inode番号)が割り当てられる。ファイルやディレクトリはシステム上ではこのinode番号で識別される。

### ■よくある例
 ディスク容量に余裕があるのに、ファイル書き込みができなくなった。 
→ inode枯渇が起きている可能性あり

### ■inode使用状況確認
```bash
[ec2-user@mitzi_dev ~]$ df -i
ファイルシス   Iノード  I使用   I残り I使用% マウント位置
/dev/xvda1     1310720 182339 1128381    14% /
devtmpfs        125487    427  125060     1% /dev
tmpfs           127523      1  127522     1% /dev/shm
```

▽各項目

| 項目 | 説明 |
|:-----------:|:------------------------:|
| Iノード | 該当deviceで利用出来るinodeの限界値 |
| I使用 | inode使用量                      |
| I残り  | inode空き容量                    |
| I使用% | inode使用率                      |

※私の環境では、何故dfコマンドの結果が日本語表記なのか。。

### ■対処
・不要なファイルを削除する

・inodeの上限数を増やす

```bash
・巻き戻せるようにコピーを取っておきましょう
$ cp -p /etc/fstab /etc/fstab.`date +%Y%m%d`

$ vi /etc/fstab
tmpfs       /dev/shm    tmpfs   defaults        0   0
↓
tmpfs       /dev/shm    tmpfs   defaults,nr_inodes=256k        0   0
※ EBSなどマウントしているディスクだともっと楽そう

・mountし直して反映
$ umount /dev/shm
$ mount /dev/shm

注: この手法の場合、ディスクの中身が真っさらになるので注意
```

#04. ディスクI/O
## 04-1. ディスクI/Oボトルネックの測定

```bash
・vmstatより
[ec2-user@mitzi_dev ~]$ vmstat 1 5
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      0 108196 149836  15396    0    0     0     2    1    1  0  0 100  0  0
 0  0      0 108220 149836  15380    0    0     0     0   40   65  0  0 100  0  0

→ bi/boの値を見ます。
bi: Blocks received from a block device (blocks/s)
bo: Blocks sent to a block device (blocks/s)。

```

#05. ネットワーク関連
## 05-1. TCPコネクション数の総数
```bash
[ec2-user@mitzi_dev ~]$ netstat -an | wc -l
120
```

## 05-2. 経路の問題確認

```bash
・経路中に応答遅延が発生していないか確認
[ec2-user@mitzi_dev ~]$ traceroute example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
 1  ec2-175-41-192-244.ap-northeast-1.compute.amazonaws.com (175.41.192.244)  19.357 ms ec2-175-41-192-242.ap-northeast-1.compute.amazonaws.com (175.41.192.242)  19.850 ms ec2-175-41-192-240.ap-northeast-1.compute.amazonaws.com (175.41.192.240)  20.097 ms
 2  100.64.2.10 (100.64.2.10)  11.821 ms 100.64.0.12 (100.64.0.12)  19.953 ms 100.64.3.72 (100.64.3.72)  22.181 ms
 3  100.64.0.197 (100.64.0.197)  607.232 ms 100.64.3.133 (100.64.3.133)  607.234 ms 100.64.2.65 (100.64.2.65)  718.342 ms
 4  100.64.17.65 (100.64.17.65)  0.413 ms 100.64.17.161 (100.64.17.161)  0.517 ms 100.64.16.99 (100.64.16.99)  0.408 ms
 5  27.0.0.159 (27.0.0.159)  0.684 ms


(省略)
```

ほぼ箇条書きになってしまいましたが、自身のメモ用の面が大きいためご容赦下さい。