【入門】負荷テスト/ボトルネック/パフォーマンス調査の方法

本記事では、以下の流れで負荷テストやパフォーマンス調査の方法を説明します。

  1. stress コマンドで実際にシステムに負荷を掛ける
  2. vmstat コマンドでパフォーマンスのボトルネックとなる箇所を特定
  3. top, iotop コマンドで原因となるプロセス (実行中のプログラム) を特定

なお、本記事は以下の書籍を参考にしています。

スポンサーリンク

stress コマンドとは

stress コマンドとはstress コマンドとは、負荷テストを行うためのツールです。

stress コマンドをインストール

sudo yum -y install epel-release
sudo yum -y install stress
スポンサーリンク

ボトルネックとなるリソースを特定 vmstat

stress コマンドで負荷をかけ、vmstat コマンドでボトルネックを特定します。

また、より詳細な情報を確認できる mpstat, iostat, free コマンドも合わせて紹介します。

CPU の待ち

プロセス (実行中のプログラム) は、以下の状態を遷移します。

プロセスCPU を使っている場合、他のプロセスは「実行可能」状態で待たされます。

検証: CPU に負荷をかける

stress -c 8 -q
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
 8  0 0 731676      0 185036    0    0     0     0  262  276 100  0  0  0  0
 8  0 0 731676      0 185036    0    0     0     0  255  261 100  0  0  0  0
 8  0 0 731676      0 185036    0    0     0     0  256  264 100  0  0  0  0

赤線部分に注目してください。

  • r:「実行可能」状態のプロセスの数が 8 個 (8個のプロセスCPU 割り当て待ち状態)
  • us: ユーザーが使用している CPU 使用率は 100%

mpstat: CPU コア毎の情報

CPU コア毎の情報がほしい場合、mpstat コマンドを使います。

mpstat -P ALL 1
08時34分29秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
08時34分30秒  all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
08時34分30秒    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

CPU コア 0 を 100% 使っていることがわかります。

ストレージ (ディスク) I/O 待ち

プロセスは、ストレージ I/O (SSD 等に読み書き) を待っている場合、「待機」状態となります。

プロセスストレージ I/O が完了するまで「待機」状態で待たされます。

検証: ストレージに負荷をかける

stress -d 8 -q
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
 0  9 0 73360      0 824500    0    0     0 59352  417  571  0  2  0 97  1
 0  9 0 74404      0 824920    0    0     0 58900  406  566  0  1  0 98  1
 0  9 0 73016      0 825896    0    0     0 65472  468  601  0  1  0 98  1

赤線部分に注目してください。

  • b:「待機」状態のプロセスの数が 9個
  • wa: CPU の I/O 待機時間率が約 98 %

iostat: I/O のパフォーマンス

ストレージ (ディスク) I/O のパフォーマンスを確認する場合は、iostat コマンドを使います。

iostat -dmtx 1
2022年08月13日 08時38分35秒
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     1.03   30.93  285.57     0.69    63.03   412.35    31.18   98.53    9.20  108.20   3.26 103.09

書き込みが 63.03 MB/s で行われていることがわかります。

メモリスワップ

プロセスCPU で実行するには、プロセスメモリに置く必要があります。

この時、物理メモリのスペースが足りなくなると、使っていないプロセスストレージのスワップファイルに退避させます。これをスワッピングと言います。

ストレージへのアクセスは時間のかかる処理のため、スワッピングは処理が遅くなります。

検証: メモリに負荷をかける

sudo dd if=/dev/zero of=/swapfile bs=128M count=32
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
stress -m 1 --vm-bytes 4G --vm-hang 0 -q
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
 0  0      0 351268      0 554168    0    0     0     0   40   57  0  0 100  0  0
 0  2 121600  51296      0 411064    0 125060  1936 125178  814 1526  5 22  5 69  0
 0  2 199680  58244      0 332940    0 74368     0 74368  383  965  1  5  0 94  0
 1  2 263168  53112      0 272252    0 63488  4040 63488  468 1046  2  6  0 92  0

赤線部分に注目してください。

  • swpd: 仮想メモリの使用量です。スワップファイルの量がどんどん増えています。
  • free: 未使用のメモリ量です。350 MB から 50MB 近くに低下してます。
  • so: ストレージにスワップした量です。free メモリが足りないのでスワップしてます。
  • wa: CPU の I/O 待機時間率です。スワップファイルへの I/O 待ちが発生してます。

free: メモリやスワップ情報

available や Swap の total を確認する場合は、free コマンドを使います。

free -m
              total        used        free      shared  buff/cache   available
Mem:            965         879          55           0          31           1
Swap:          4095         430        3665
スポンサーリンク

リソースを占有するプロセスを特定 top

リソースを占有するプロセスを特定する場合、top, iotop コマンドを利用します。

CPU を独占する場合

stress -c 8 -q
top
Tasks: 109 total,   9 running,  59 sleeping,   0 stopped,   0 zombie
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                          
 4013 ec2-user  20   0    7452     92      0 R 12.6  0.0   0:02.20 stress                           
 4011 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4012 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4014 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4015 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4016 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4017 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress                           
 4018 ec2-user  20   0    7452     92      0 R 12.3  0.0   0:02.19 stress  
 4064 ec2-user  20   0  168944   4408   3756 R  0.3  0.4   0:00.04 top

shift + m で CPU 使用率順にソートできます。

赤線部分に注目してください。以下が CPU 全体の情報です。

以下がプロセスごとの CPU の情報です。

ストレージ I/O を独占する場合

ストレージ (ディスク) I/O は top コマンドで見れないので、iotop コマンドで確認します。

sudo yum -y install iotop
stress -d 8 -q
sudo iotop -d 1
Total DISK READ :       0.00 B/s | Total DISK WRITE :      60.19 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:      64.34 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO    COMMAND                                         
 5074 be/4 ec2-user    0.00 B/s    8.66 M/s  0.00 % 99.99 % stress -d 8 -q
 5076 be/4 ec2-user    0.00 B/s    8.01 M/s  0.00 % 99.99 % stress -d 8 -q
 5071 be/4 ec2-user    0.00 B/s    8.66 M/s  0.00 % 99.72 % stress -d 8 -q
 5069 be/4 ec2-user    0.00 B/s    8.34 M/s  0.00 % 99.64 % stress -d 8 -q
 5075 be/4 ec2-user    0.00 B/s    8.34 M/s  0.00 % 99.19 % stress -d 8 -q
 5072 be/4 ec2-user    0.00 B/s    7.69 M/s  0.00 % 98.87 % stress -d 8 -q
 5073 be/4 ec2-user    0.00 B/s    7.69 M/s  0.00 % 98.06 % stress -d 8 -q
 5070 be/4 ec2-user    0.00 B/s    8.34 M/s  0.00 % 97.99 % stress -d 8 -q

赤線部分に注目してください。以下がストレージ (ディスク) I/O 全体の情報です。

以下が個別プロセスの情報です。

  • DISK WRITE: プロセスは約 8M/s で書き込む
  • IO: プロセスが I/O リクエストに費やした時間の割合が約 99%
  • COMMAND: ボトルネックとなるコマンドは stress -d 8 -q

メモリを独占する場合

stress -m 1 --vm-bytes 4G --vm-hang 0 -q
top
%Cpu(s):  0.7 us,  5.1 sy,  0.0 ni,  0.0 id, 93.9 wa,  0.0 hi,  0.0 si,  0.3 st
MiB Mem :    965.5 total,     67.8 free,    843.1 used,     54.6 buff/cache
MiB Swap:   4096.0 total,    753.2 free,   3342.8 used.     24.1 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                  
 3442 ec2-user  20   0 4201892 852028      4 D  3.9 86.2   0:01.41 stress   

shift + m でメモリ使用率順にソートできます。shift + e で単位を変更できます。

赤線部分に注目してください。以下がメモリ全体の情報です。

  • wa: スワップファイルへの I/O 待ちが CPU の大半を占めます
  • MiB Mem: メモリ965.5 MB = 空き 67.8 MB + 使用中 843.1 MB + キャッシュ 54.6 MB
  • MiB Swap: スワップ 4096 MiB = 空き 753.2 MiB + 使用中 3342.8 MiB

avail Mem について


avail Mem は以下の free + buff/cache のうち、解放可能な部分に相当。
(MiB Swap の行の情報だが、実際は MiB Mem の情報)

以下がプロセスごとに使用するメモリの情報です。

過去のリソースの使用状況を確認

vmstat や top は現在のリソース状況しか確認できません。

過去のリソースの使用状況 (累積アクティビティ) を確認するには、sar コマンドを利用します。

sar
04時00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
08時00分01秒     all      0.88      0.00      0.47     14.57      0.08     84.01
08時10分01秒     all      0.87      0.00      0.20      0.01      0.02     98.90
08時20分01秒     all      0.70      0.00      0.44      2.37      0.03     96.47
平均値:      all      0.28      0.00      0.16      2.68      0.03     96.84

関連記事

■ Linux の基本

Linux カーネル