サーバのボトルネックを調査する

# ロードアベレージ

- CPU1コアに対して平均的にどれだけのプロセスが実行待ち状態になっているかという指標
- 左から1分前、5分前、15分前の数値
- CPUのコア数未満の値の場合、正常値とみなすことができる

```bash
$ uptime
 14:00:46 up 1 min,  1 user,  load average: 0.24, 0.13, 0.05
```

- ちなみにCPUの情報は以下のコマンドから取得できる

```bash
# 物理CPUの数
$ grep physical.id /proc/cpuinfo | sort -u | wc -l
1
# CPU毎のコア数
$ grep cpu.cores /proc/cpuinfo | sort -u          
cpu cores       : 2
# 論理プロセッサ数
# 通常は物理CPUの数 x CPU毎のコア数
# ハイパースレッディング等の機能が有効になっている場合、これを上回る場合がある
$ grep processor /proc/cpuinfo | wc -l  
2
```

# CPU負荷

- topコマンドによる取得方法
- `id`はidle、つまり使用されていないCPU利用率
- `-c`でプログラム名ではなくコマンド名を表示
- `-d 1`で1秒ごとに更新

```bash
$ top

top - 22:48:58 up 20 days,  6:59,  1 user,  load average: 0.04, 0.08, 0.03
Tasks: 254 total,   1 running, 253 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7821.5 total,    610.2 free,   1725.4 used,   5485.9 buff/cache
MiB Swap:   2048.0 total,   1964.2 free,     83.8 used.   5376.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                           
    727 root      20   0 1429856  52316  33904 S   0.7   0.7  84:26.28 containerd                                                                                        
  28015 kazukic+  20   0 4949764 285280 125064 S   0.3   3.6  29:38.08 gnome-shell                                                                                       
  33872 kazukic+  20   0  642000  69584  51248 S   0.3   0.9   0:21.06 gnome-terminal-                                                                                   
  41373 kazukic+  20   0   32.6g  91620  59020 S   0.3   1.1  31:25.68 slack                                                                                             
  41414 kazukic+  20   0   40.7g 282692 102284 S   0.3   3.5 121:17.62 slack                                                                                             
  50010 kazukic+  20   0 2672496 247888  98620 S   0.3   3.1  17:16.31 Isolated Web Co                                                                                   
 223216 kazukic+  20   0   14068   4080   3380 R   0.3   0.1   0:00.39 top                                                                                               
      1 root      20   0  166096  12536   7712 S   0.0   0.2   0:34.36 systemd                                                                                           
      2 root      20   0       0      0      0 S   0.0   0.0   0:01.07 kthreadd                                                                                          
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                            
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                                        
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri                                                                       
      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq                                                                                      
     10 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_                                                                                   
     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace                                                                                   
     12 root      20   0       0      0      0 S   0.0   0.0   0:15.57 ksoftirqd/0                                                                                       
     13 root      20   0       0      0      0 I   0.0   0.0   2:21.22 rcu_sched                                                                                         
     14 root      rt   0       0      0      0 S   0.0   0.0   0:07.08 migration/0                                                                                       
     15 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0                                                                                     
     16 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0                                                                                           
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                                                                                           
     18 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1                                                                                     
     19 root      rt   0       0      0      0 S   0.0   0.0   0:07.35 migration/1                                                                                       
     20 root      20   0       0      0      0 S   0.0   0.0   0:00.90 ksoftirqd/1       
```

- `htop`コマンドによる取得方法
- デフォルトではインストールされていないため、追加でインストールが必要
- 上段がコア毎のCPU使用率
- 下段がプロセス毎のCPU使用率
- 継続的に15%を超える負荷が続いている場合、ボトルネックとなっている可能性が高い

```bash
$ htop
```

![スクリーンショット 2022-06-03 4.03.37 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/cbf43c5a-7bf5-68cc-e918-e1978df863cd.png)


# メモリ負荷

- `free`コマンドによる取得方法
- `total`はメモリの総量、`used`はメモリの使用量
- `--human`又は`-h`オプションで人間が読みやすいように単位をつけて表示する

```bash
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.6Gi       1.7Gi       612Mi       424Mi       5.4Gi       5.3Gi
Swap:          2.0Gi        83Mi       1.9Gi
```

- 上段がメモリとスワップの使用率
- 下段がプロセス毎のメモリ使用率

```bash
$ htop
```

![スクリーンショット 2022-06-03 4.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78249/8b8ac5b1-6e94-1733-fbd5-9839195cedb7.png)

# ディスクI/O

- 引数の`1`は1秒毎に表示するという意味
- `io`欄の
    - `bi`がブロックデバイスからの読み込み
    - `bo`がブロックデバイスへの書き込み
- 単位はブロック数/毎秒
- 継続的に大きなデータの読み込み/書き込みが行われている場合(目安としては100)、ボトルネックとなっている可能性が高い

```bash
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1052432  52184 422528    0    0   104     7  146  167  1  1 98  0  0
 1  0      0 1051928  52184 422528    0    0     0     0  362  357  1  1 98  0  0
 0  0      0 1051928  52184 422528    0    0     0     0  351  353  1  0 99  0  0
 1  0      0 1051928  52192 422524    0    0     0    88  291  322  1  1 98  0  0
 1  0      0 1051928  52192 422532    0    0     0   160  378  320  1  0 99  0  0
^C

```

# ネットワークトラフィック

- デフォルトではインストールされていないため、追加でインストールが必要

```bash
$ sudo apt install -y vnstat
```

- `-i`オプションではネットワークインタフェースを指定する
    - ネットワークインタフェースは`ifconfig`や`ip a`コマンドから確認可能
- `-l`オプションを指定するとパケットの推移を監視できる
- rxは受信パケット(Receiver)
- txは送信パケット(Transmitter)
- アクセス数や通信内容にもよるが、1Mbit/sを上回る場合はボトルネックとなっている可能性が高い

```bash
$ vnstat -i eth0 -l
Monitoring eth0...    (press CTRL-C to stop)

   rx:     1.94 kbit/s     3 p/s          tx:     1.94 kbit/s     3 p/s^C


 eth0  /  traffic statistics

                           rx         |       tx
--------------------------------------+------------------
  bytes                    23.71 MiB  |      687.19 KiB
--------------------------------------+------------------
          max           34.77 Mbit/s  |   487.26 kbit/s
      average            2.43 Mbit/s  |    68.65 kbit/s
          min                0 bit/s  |         0 bit/s
--------------------------------------+------------------
  packets                      18548  |            3188
--------------------------------------+------------------
          max               2905 p/s  |         168 p/s
      average                226 p/s  |          38 p/s
          min                  0 p/s  |           0 p/s
--------------------------------------+------------------
  time                  1.37 minutes


```