CPU、メモリ、ネットワーク高負荷時の調査について



●システムの負荷の原因を切り分けるには

 参考URL:サーバのボトルネックを調査する
 参考URL:システムの負荷の原因を切り分ける方法
 参考URL:load averageを見てシステムの負荷を確認する
 参考URL:コマンドによる「負荷」の原因切り分け

 サーバが重い時、下記の4つがボトルネックとなる場合が多いです。
  • CPU使用率
  • メモリ使用量
  • ディスクI/O
  • TCPコネクション数
 load averageの値が高くなる(大きくなる)、つまりシステムの負荷とは「CPUの実行権限が与えられるのを待っているプロセス」と「ディスクI/Oの完了を待っているプロセス」の多さのこと、だそうです。
  • ロードアベレージが高い
    • CPU使用率がほぼ100%
      • 「1. CPU使用率」
    • スワップが発生している
      • 「2. メモリ使用量」
    • スワップが発生していない
      • 「3. ディスクI/O」
  • ロードアベレージが低い
    • TCPコネクション数が多い
      • 「4. TCPコネクション」
    • TCPコネクション数が少ない
      • 他のホストを疑う


●CPU高負荷調査

 uptime

 システムが実行されている時間を表示します。
$ uptime
 15:37:02 up 1 day,  8:03,  3 users,  load average: 0.37, 0.16, 0.0
 現在の時間、ログインユーザの数、load averageも家訓することができます。

 w

 誰がログオンしていて、何をしているかを表示します。
 1行目はuptimeと同じものが表示されます。
$ w
 14:03:26 up 27 days,  3:47,  1 user,  load average: 1.11, 0.80, 0.73
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
foo      tty7     tty7             日13   20days  1:51m  0.01s /opt/google/chrome/chrome --type=renderer --enable-crashpad --crash


 top

 実行中のプロセスをリアルタイムで表示します。「shift + p」でメモリ使用率(%CPU)順に並び替えることができます。
# top
top - 16:02:58 up 27 days,  5:47,  1 user,  load average: 0.98, 0.86, 0.77
Tasks: 536 total,   1 running, 535 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.4 us,  4.9 sy,  0.0 ni, 69.7 id, 17.1 wa,  0.8 hi,  0.2 si,  0.0 st
MiB Mem :  15775.8 total,    161.1 free,   5763.7 used,   9851.1 buff/cache
MiB Swap:   8048.0 total,   4942.4 free,   3105.6 used.   9513.0 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                      
1018925 zabbix    20   0   94960  26200   7516 D  22.5   0.2   0:00.68 rpm                                                          
 999054 root      20   0       0      0      0 I  11.9   0.0   1:11.35 kworker/u8:4-xfs-cil/dm-0                                    
3782714 zebra     20   0 3963060 201144  70704 S   3.6   1.2  56:52.70 gnome-shell                                                                                                         
 「1(数字のイチ)」でCPUコアごとの使用率(画面上部に表示)を表示することができます。
top - 16:41:52 up 27 days,  6:26,  1 user,  load average: 1.13, 0.66, 0.64
Tasks: 537 total,   2 running, 534 sleeping,   0 stopped,   1 zombie
%Cpu0  :  2.7 us,  3.0 sy,  0.0 ni, 88.6 id,  5.4 wa,  0.3 hi,  0.0 si,  0.0 st
%Cpu1  :  1.7 us, 10.0 sy,  0.0 ni, 67.7 id, 14.7 wa,  2.7 hi,  3.3 si,  0.0 st
%Cpu2  :  3.3 us,  4.0 sy,  0.0 ni, 42.5 id, 49.5 wa,  0.7 hi,  0.0 si,  0.0 st
%Cpu3  :  2.3 us, 13.4 sy,  0.0 ni, 63.8 id, 18.8 wa,  1.3 hi,  0.3 si,  0.0 st

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                      
 756237 zebra     20   0   13.9g 643732 101732 S   1.0   4.0  10:09.46 /usr/share/teams-insiders/teams-insiders --type=renderer --+ 
 114926 zebra     20   0 3711324 420956 138192 S   1.0   2.6   9:30.87 /usr/lib64/thunderbird/thunderbird                           
   4628 root      20   0 1118216 366272  23844 S   0.0   2.3   3:21.18 /usr/libexec/packagekitd                                     


 ps aux --sort -%cpu

 実行しているプロセスをCPU使用率でソートして表示します。
 -%cpuは、CPU使用率を降順で表示する、という意味です。
# ps aux --sort -%cpu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     19357  0.8  0.5 194388 96128 ?        SLsl 10月18  19:51 corosync
root      1697  0.7  0.4 2580244 68776 ?       Ssl  10月18  18:25 /usr/bin/python2 -s /usr/bin/fail2ban-server -xf start
zebra     6391  0.4  0.9 4584660 151216 ?      Sl   10月18  10:48 /usr/bin/gnome-shell
mysql     2681  0.3 27.1 5543300 4416564 ?     Sl   10月18   7:16 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plu


 vmstat

 システムのメモリ、プロセス、割り込み、ページング及びブロックI/Oに関する要約情報を収集して表示します。
$ vmstat
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 2334308 325332  19412 10169788    2    3   144   540    4    3  2  2 93  3  0
  • procs:プロセスに関する情報
  • memory:メモリに関する情報
  • io:ディスクアクセスに関する情報
  • cpu:CPU使用率に関する情報
 ioの中にある、bi boがディスクの入出力を示します。
 この値が常に大きい場合、ディスクの読み書きが追いついていない可能性もあります。
 また、vmstatコマンドの後ろに数字を付けると定期的に実行することができます。
 vmstat 5 10とすると、5秒おきに10回結果が出力されます。
$ vmstat 5 10
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 2333540 474248  19392 10103988    2    3   144   540    1    1  2  2 93  3  0
 1  0 2333540 473576  19392 10104108    0    0     0     7 7777 15302  1  1 97  0  0
 0  0 2333540 473220  19392 10104196    0    0     0    62 8158 15793  2  2 97  0  0
 0  0 2333540 473492  19392 10104196    0    0     0     2 6739 12995  1  1 97  0  0
 1  0 2333540 473544  19392 10104276    0    0     0    87 10731 20835  1  2 97  0  0
 0  0 2333540 473088  19392 10104276    0    0     0    40 9395 18255  1  2 97  0  0
 0  0 2333540 464660  19392 10108680    3    0   629    76 7784 15008  4  3 91  1  0
 0  0 2333540 464492  19392 10108680    0    0     0     1 6858 13500  1  1 98  0  0
 0  0 2333540 469416  19392 10108056    0    0     0    98 9171 17542  3  3 94  0  0
 0  0 2333540 470336  19392 10108056    0    0     0    45 6053 11720  1  1 97  0  0


●メモリ高負荷調査

 free -m

 システムの空きメモリと使用済みメモリの量を表示します。
# free -m
              total        used        free      shared  buff/cache   available
Mem:          15885        7190        3184         144        5510        8215
Swap:          3967           8        3959


 w

 誰がログオンしていて、何をしているかを表示します。
$ w
 14:03:26 up 27 days,  3:47,  1 user,  load average: 1.11, 0.80, 0.73
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
foo      tty7     tty7             日13   20days  1:51m  0.01s /opt/google/chrome/chrome --type=renderer --enable-crashpad --crash


 ps aux --sort -%mem

 実行しているプロセスをメモリ使用率でソートして表示します。
 -%memは、メモリ使用率を降順で表示する、という意味です。
# ps aux --sort -%mem
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql     2681  0.3 27.1 5543300 4416564 ?     Sl   10月18   7:16 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plu
tomcat    1586  0.1  5.0 7848704 822584 ?      Ssl  10月18   3:03 /usr/lib/jvm/jre/bin/java -Djavax.sql.DataSource.Factory=org.apac
named     2259  0.0  1.1 474572 179148 ?       Ssl  10月18   0:03 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot


 top

 実行中のプロセスをリアルタイムで表示します。「shift + m」でメモリ使用率順に並び替えることができます。
# top
top - 14:24:15 up 1 day,  6:51,  3 users,  load average: 0.05, 0.10, 0.07
Tasks: 427 total,   1 running, 426 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.4 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16266504 total,  3245604 free,  7369712 used,  5651188 buff/cache
KiB Swap:  4063228 total,  4055036 free,     8192 used.  8405844 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                         
 2681 mysql     20   0 5543300   4.2g   6592 S   0.3 27.2   6:00.68 mysqld                                                          
 1586 tomcat    20   0 7848704 830008  10432 S   0.0  5.1   2:27.70 java                                                            
 2259 named     20   0  474568 173832   3528 S   0.0  1.1   0:03.09 named                                                           


 ls -l /proc/<プロセスID>/cwd

 参考URL:Red Hat Enterprise Linux 4: リファレンスガイド 5.3. /proc/配下のディレクトリ

 topやpsでメモリ使用率が高いプロセスを特定後、詳細情報確認のために/proc/配下を確認します。
 たとえば、cwdには「そのプロセスで現在動作しているディレクトリへのシンボリックリンク」が確認できます。
# ls -l /proc/2681/cwd
lrwxrwxrwx. 1 mysql mysql 0 10月 19 14:28 /proc/2681/cwd -> /var/lib/mysql


 vmstat

 システムのメモリ、プロセス、割り込み、ページング及びブロックI/Oに関する要約情報を収集して表示します。
$ vmstat
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 2334308 325332  19412 10169788    2    3   144   540    4    3  2  2 93  3  0
  • procs:プロセスに関する情報
  • memory:メモリに関する情報
  • io:ディスクアクセスに関する情報
  • cpu:CPU使用率に関する情報
 ioの中にある、bi boがディスクの入出力を示します。
 この値が常に大きい場合、ディスクの読み書きが追いついていない可能性もあります。
 また、vmstatコマンドの後ろに数字を付けると定期的に実行することができます。
 vmstat 5 10とすると、5秒おきに10回結果が出力されます。
$ vmstat 5 10
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 2333540 474248  19392 10103988    2    3   144   540    1    1  2  2 93  3  0
 1  0 2333540 473576  19392 10104108    0    0     0     7 7777 15302  1  1 97  0  0
 0  0 2333540 473220  19392 10104196    0    0     0    62 8158 15793  2  2 97  0  0
 0  0 2333540 473492  19392 10104196    0    0     0     2 6739 12995  1  1 97  0  0
 1  0 2333540 473544  19392 10104276    0    0     0    87 10731 20835  1  2 97  0  0
 0  0 2333540 473088  19392 10104276    0    0     0    40 9395 18255  1  2 97  0  0
 0  0 2333540 464660  19392 10108680    3    0   629    76 7784 15008  4  3 91  1  0
 0  0 2333540 464492  19392 10108680    0    0     0     1 6858 13500  1  1 98  0  0
 0  0 2333540 469416  19392 10108056    0    0     0    98 9171 17542  3  3 94  0  0
 0  0 2333540 470336  19392 10108056    0    0     0    45 6053 11720  1  1 97  0  0


●ネットワーク高負荷調査

 vnstat -i <ネットワークインターフェース> -l

 ネットワークトラフィックを表示します。
$ sudo dnf install -y vnstat

$ vnstat -i enp3s0 -l
Monitoring enp3s0...    (press CTRL-C to stop)

   rx:     6.88 kbit/s    11 p/s          tx:     5.66 kbit/s     9 p/s^C


 enp3s0  /  traffic statistics

                           rx         |       tx
--------------------------------------+------------------
  bytes                     1.09 GiB  |       20.65 MiB
--------------------------------------+------------------
          max          488.22 Mbit/s  |     7.92 Mbit/s
      average           55.54 Mbit/s  |     1.03 Mbit/s
          min            1.33 kbit/s  |     1.42 kbit/s
--------------------------------------+------------------
  packets                     798735  |          295765
--------------------------------------+------------------
          max              41520 p/s  |       14760 p/s
      average               4754 p/s  |        1760 p/s
          min                  2 p/s  |           2 p/s
--------------------------------------+------------------
  time                  2.80 minutes