Linuxリソース確認系コマンドの使いドコロ

# はじめに
リソース確認系コマンドの使いドコロ、切り分けの勘所を自分メモ用に軽くまとめました。
内容は随時追加・アップデートしていければよいなという趣きですはい。

# サーバ負荷を見極める指標
## サーバ負荷は大きく以下の2つに分けられます
- CPU負荷
- I/O負荷

## 負荷状況を確認する指標
- ロードアベレージ
- CPU使用率
- I/O負荷
- メモリ

# 確認したい負荷状況指標
## ロードアベレージ
### **ロードアベレージとは**

簡単に言うと、**実行待ちのプロセス数**のことで、もう少し詳しく言うと、
**CPUの実行権限付与待ちのプロセス**と**ディスクI/O完了待ちプロセス**の総数ということですかね。

###### ※これ以上はLinuxカーネル周りの話になってきてしまうので割愛致しますというかよくわかりませんorz

### **ロードアベレージの指標**
基本的にはロードアベレージは1未満がベストですが、
マルチコアなどの場合は少し注意が必要のようです。

くわしくは[こちら](http://d.hatena.ne.jp/naoya/20070518/1179492085)に素晴らしい記事がございますのでご参照下さい。

掻い摘んでいうと
> **(負荷があるとき && 均等に分散される場合は)
「ロードアベレージは CPU の数で割った数値を見る！」**

と言うことでしょうかね。

### **ロードアベレージを確認できるコマンド**
- **``w``**
- **``top``**
- **``sar -q``**

#### **uptime**

```shell-session:uptime
[root@centos6 ~]# uptime
 10:56:26 up 10 min,  2 users,  load average: 0.00, 0.06, 0.07
```

#### **w**

```shell-session:w
[root@centos6 ~]# w
 11:01:33 up 15 min,  1 users,  load average: 0.00, 0.02, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.21.1.48      10:46    0.00s  0.01s  0.00s w
```

#### **top**

```shell-session:top
[root@centos6 ~]# top

top - 11:05:03 up 18 min,  2 users,  load average: 0.00, 0.01, 0.03
Tasks: 107 total,   1 running, 106 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.7%us,  0.7%sy,  0.0%ni, 95.9%id,  1.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1922252k total,   535812k used,  1386440k free,    17324k buffers
Swap:  1675260k total,        0k used,  1675260k free,   417308k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      20   0 19356 1540 1228 S  0.0  0.1   0:00.95 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
    4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
    5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    7 root      20   0     0    0    0 S  0.0  0.0   0:00.05 events/0
    8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events/0
    9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events_long/0
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events_power_ef
```

#### **sar -q**

```shell-session:sarで1秒毎10回値を取得
[root@centos6 ~]$ sar -q 1 10
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp)  2015年12月24日  _x86_64_        (16 CPU)

12時52分37秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
12時52分38秒         0       961      0.32      0.28      0.23
12時52分39秒         0       960      0.32      0.28      0.23
12時52分40秒         0       960      0.32      0.28      0.23
12時52分41秒         0       960      0.32      0.28      0.23
12時52分42秒         0       960      0.29      0.27      0.23
12時52分43秒         0       960      0.29      0.27      0.23
12時52分44秒         1       960      0.29      0.27      0.23
12時52分45秒         0       960      0.29      0.27      0.23
12時52分46秒         0       960      0.29      0.27      0.23
12時52分47秒         0       960      0.27      0.27      0.23
平均値:          0       960      0.30      0.27      0.23
```
***

## CPU
### **CPUとは**
CentralProcessingUnitの略で「中央処理装置」という意味です。
詳細は[こちら](http://homepage2.nifty.com/kamurai/CPU.htm#core)をご確認下さい。

### **CPU使用率**
基本的にCPUのリソース状況を見る時にはCPUの使用率を見ると言い換えて差し支えないと思いますので、各コマンドと共にCPU使用率の見方を見ていきます。

### **CPU使用率を確認できるコマンド**
- **``top``**
- **``sar -u``**
- **``sar -P``**

#### **top**

マルチコアの場合`top`コマンド後に`1`を押下するとコア数毎のCPU使用率の情報が表示されます。
**`top`コマンドはCPUの利用についての情報を占有時間の割合で表示しています。**

```shell-session:top
[root@centos6 ~]# top
top - 12:21:00 up 6 days, 16:33,  1 user,  load average: 0.39, 0.34, 0.28
Tasks: 946 total,   1 running, 945 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.3%us,  0.3%sy,  0.1%ni, 99.2%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.1%us,  0.3%sy,  0.0%ni, 99.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.2%us,  0.3%sy,  0.0%ni, 99.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.1%us,  0.5%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu8  :  0.0%us,  0.2%sy,  0.1%ni, 99.6%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu9  :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu10 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu11 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu12 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu13 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu14 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu15 :  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16332608k total,  6501420k used,  9831188k free,   250696k buffers
Swap:  8232956k total,        0k used,  8232956k free,  4524892k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
   79 root      20   0     0    0    0 S  0.5  0.0   0:12.60 events/12
12793 webmail   20   0 15700 1936  928 R  0.5  0.0   0:00.03 top
```

##### 各項目について
|項目|内容|
|:--|:--|
|us|ユーザプロセス（プログラムを実行することによって生成されるプロセス）の使用時間|
|sy|システムプロセス（OSによって生成されるプロセス）の使用時間|
|ni|実行優先度（nice値）を変更したユーザプロセスの使用時間|
|id|アイドル状態の使用時間|
|wa|I/O終了待ちをしている時間|
|hi|ハードウェア割込み要求での使用時間|
|si|ソフトウェア割込み要求での使用時間|
|st|CPUリソースを割り当ててもらえなかった時間|

#### **sar -u**

```shell-session:全てのコア
[root@centos6 ~]$ sar -u 1 10
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp)  2015年12月25日  _x86_64_        (16 CPU)

17時32分15秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
17時32分16秒     all      0.00      0.00      0.19      0.00      0.00     99.81
17時32分17秒     all      0.12      0.00      0.25      0.00      0.00     99.62
17時32分18秒     all      0.06      0.00      0.13      0.00      0.00     99.81
17時32分19秒     all      0.06      0.00      0.25      0.00      0.00     99.69
17時32分20秒     all      0.00      0.06      0.13      0.00      0.00     99.81
17時32分21秒     all      0.06      0.00      0.19      0.00      0.00     99.75
17時32分22秒     all      0.06      0.00      0.13      0.00      0.00     99.81
17時32分23秒     all      0.00      0.00      0.06      0.00      0.00     99.94
17時32分24秒     all      0.00      0.06      0.19      0.00      0.00     99.75
17時32分25秒     all      0.06      0.06      0.19      0.00      0.00     99.69
平均値:      all      0.04      0.02      0.17      0.00      0.00     99.77
```

```shell-session:各コア毎
[root@centos6 ~]$ sar -P ALL 1 1
Linux 2.6.32-573.8.1.el6.x86_64 (centos6.jp)  2015年12月25日  _x86_64_        (16 CPU)

17時33分23秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
17時33分24秒     all      0.06      0.00      0.19      0.00      0.00     99.75
17時33分24秒       0      0.00      0.00      0.99      0.00      0.00     99.01
17時33分24秒       1      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       2      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       3      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       4      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       5      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       6      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       7      0.00      0.00      3.00      0.00      0.00     97.00
17時33分24秒       8      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒       9      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      10      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      11      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      12      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      13      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      14      0.00      0.00      0.00      0.00      0.00    100.00
17時33分24秒      15      0.00      0.00      0.00      0.00      0.00    100.00

平均値:      CPU     %user     %nice   %system   %iowait    %steal     %idle
平均値:      all      0.06      0.00      0.19      0.00      0.00     99.75
平均値:        0      0.00      0.00      0.99      0.00      0.00     99.01
平均値:        1      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        2      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        3      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        4      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        5      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        6      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        7      0.00      0.00      3.00      0.00      0.00     97.00
平均値:        8      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        9      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       10      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       11      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       12      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       13      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       14      0.00      0.00      0.00      0.00      0.00    100.00
平均値:       15      0.00      0.00      0.00      0.00      0.00    100.00
```

### **CPU負荷で着目するのは`%user`と`%system`**
#### `%user`値が高い場合
ユーザプロセスがCPUを使用している状態で、**基本的にI/O等にボトルネックはない**
主な原因としては以下

- プロセスがCPUパワーを必要とする処理をしている
- プロセスが暴走して大量にCPUを消費している

#### `%system`値が高い場合
カーネル空間の処理にCPUを消費している状態
主な原因としては以下

- I/O負荷でCPUを消費している
- 大きいプロセスを高頻度で`fork`（プロセスのコピーを生成）している


### **CPU負荷が高い時の具体的な対応**
- CPU使用率の高い該当プロセスを暫定的に停止する
- 恒久的にはその処理のアルゴリズムやスケジューリングを見直す
- CPUを性能の良いものにする

***

## メモリ
### **メモリとは**
[こちら](http://homepage2.nifty.com/kamurai/MEMORY.htm)をご確認くあだしあ！

### **メモリ使用率を確認できるコマンド**
#### プロセスのメモリ使用量を見る
- **``free``**
- **``sar -r``**

#### 各プロセスのメモリ使用状況を確認
- **``top``**

#### **free**

```shell-session:free
[root@centos6]# free
             total       used       free     shared    buffers     cached
Mem:       1922252    1395776     526476      15592     131696     977832
-/+ buffers/cache:     286248    1636004
Swap:      1675260          0    1675260
```

#### **sar -r**
時間推移と共にメモリがどの程度使用されているか確認できる

```shell-session:sar
[root@centos6]# sar -r 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp)         2016年01月08日  _x86_64_        (1 CPU)

13時08分33秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
13時08分34秒    504460   1417792     73.76    131752    978044   1893420     52.63
13時08分35秒    525692   1396560     72.65    131752    978076   1870264     51.99
13時08分36秒    525660   1396592     72.65    131752    978080   1870264     51.99
13時08分37秒    520396   1401856     72.93    131752    978080   1870264     51.99
13時08分38秒    525084   1397168     72.68    131756    978080   1874176     52.10
13時08分39秒    525544   1396708     72.66    131756    978080   1870264     51.99
13時08分40秒    525544   1396708     72.66    131756    978080   1870264     51.99
13時08分41秒    525528   1396724     72.66    131756    978084   1870264     51.99
13時08分42秒    525736   1396516     72.65    131756    978084   1870264     51.99
13時08分43秒    525544   1396708     72.66    131760    978088   1870264     51.99
平均値:     522919   1399333     72.80    131755    978078   1872971     52.06
```

|項目|意味|
|:--|:--|
|kbmemfree|物理メモリの空き容量|
|kbmemused|使用中のメモリの容量|
|%memused|物理メモリ使用率|
|kbbuffers|バッファとして使用されている物理メモリの使用率|
|kbcached|キャッシュとして使用されている物理メモリの使用率|
|kbswpfree|スワップ領域の空き容量|
|kbswpused|使用中のスワップ領域の容量|
|%swpused|スワップ使用率|
|kbswpcad|キャッシュされたswap領域の容量|

### **メモリ使用率が高い時の具体的な対応**
- 暫定策としてはメモリを占有している該当プロセスを終了させる
- 恒久策としてはプログラムのメモリ使用率の改善またはメモリの増設を行う

### **スワップ発生の流れ**
1. プロセスのメモリ使用量が増えると、キャッシュにメモリが使えなくなる
2. スワップ領域が使用されディスクI/Oが増加する
3. I/Owaitとなるプロセスが増える
4. 処理が遅くなる

### **スワップの発生状況の確認**
スワップが多発するとサーバのスループットが低下する


#### **sar -W**
`sar -r`と組み合わせることでスワップが発生した時間帯に、どの程度メモリが使用されていたか確認できる

```shell-session
[root@centos6 ]# sar -W 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp)         2016年01月08日  _x86_64_        (1 CPU)
23時30分00秒  pswpin/s pswpout/s
23時30分01秒      0.00      0.00
23時30分02秒     64.79      0.00
23時30分03秒      0.00   4613.51
23時30分04秒      8.42   5708.42
23時30分05秒      0.00   4497.80
23時30分06秒      0.00   4522.73
23時30分07秒      0.00   3886.32
23時30分08秒      0.00   5215.00
23時30分09秒     55.17   5801.15
23時30分10秒      0.00   3634.83
平均値:      34.17   4491.55
```

## ディスクI/O
### **ディスクI/Oとは**
ハードディスクなどの外部記憶装置に対するデータの読み書きのことですね！

- シーケンシャルアクセス（シーケンシャルリード/シーケンシャルライト）
記憶媒体の中で連続した領域に読み書き

- ランダムアクセス（ランダムリード/ランダムライト）
飛び飛びの領域に読み書き

### **ディスクI/Oを確認できるコマンド**
- **``dstat``**
- **``sar -b``**

```shell-session
[root@centos6 ~]# sar -b 1 10
Linux 2.6.32-573.12.1.el6.x86_64 (centos6.jp)         2016年01月08日  _x86_64_        (1 CPU)

13時50分19秒       tps      rtps      wtps   bread/s   bwrtn/s
13時50分20秒      0.00      0.00      0.00      0.00      0.00
13時50分21秒     12.00      0.00     12.00      0.00    128.00
13時50分22秒      2.00      0.00      2.00      0.00     16.00
13時50分23秒      0.00      0.00      0.00      0.00      0.00
13時50分24秒      0.00      0.00      0.00      0.00      0.00
13時50分25秒     48.00      2.00     46.00     16.00    416.00
13時50分26秒  20028.71      0.00  20028.71      0.00 317734.65
13時50分27秒     34.34      0.00     34.34      0.00    290.91
13時50分28秒      3.96      0.00      3.96      0.00     31.68
13時50分29秒      0.00      0.00      0.00      0.00      0.00
平均値:    2032.90      0.20   2032.70      1.60  32179.20
```

|項目|意味|
|:--|:--|
|tps|物理デバイスへの1秒間のI/Oリクエストの転送量|
|rtps|物理デバイスへの1秒間の読み込みリクエストの転送量|
|wtps|物理デバイスへの1秒間の書き込みリクエストの転送量|
|bread/s|1秒間に読み出されたデータ量(ブロック単位)|
|bwrtn/s|1秒間に書き込まれたデータ量(ブロック単位)|

#### **`top`、`sar`コマンドで`%iowait`が高い場合**
CPUの`%iowait`が高い場合、まず**メモリ、スワップの状態を確認**する

- CPU使用率とは
`%user`と`%system`の合計値を指し、`%iowait`が高い状態であっても、CPUを必要とするプロセスが他にある場合、そのプロセスはCPUを使用可能

- I/O負荷とは
**CPUがアイドル状態（待機状態）**で、OS上に未処理のディスク入出力（読み書き）要求があった時間の割合を意味する

- つまり
システムの応答が遅いなどの時に、
CPU使用率の`%iowait`が`%user`や`%system`に比べて高い状態である場合、
CPUを使用する処理が大きくないのにディスクへの読み書き要求が発生していることになり、
**ディスクI/Oがボトルネック**になっている可能性がある

これは、求められるI/O要求に対して、ディスクの処理速度が追いついていない状態になり、
以下のことが考えられる

- アプリケーション自体がディスクにアクセスする速度が遅い
- メモリが不足していてスワップ領域へのアクセスが頻発していて遅い

### **具体的な対策**
- 該当プログラムの修正を行い、ディスクアクセスを減少させる
- ディスクの増設・RAID構成の見直しを行いI/Oの分散を実施する
- SSDなどの高速なディスクを利用する


# 参考
[こちら](http://d.hatena.ne.jp/daislog/20111108/1320774441)を主に参考にさせて頂きました！