本記事では、以下の流れで負荷テストやパフォーマンス調査の方法を説明します。
- stress コマンドで実際にシステムに負荷を掛ける
- vmstat コマンドでパフォーマンスのボトルネックとなる箇所を特定
- top, iotop コマンドで原因となるプロセス (実行中のプログラム) を特定
なお、本記事は以下の書籍を参考にしています。
stress コマンドとは
stress コマンドをインストール
ボトルネックとなるリソースを特定 vmstat
stress コマンドで負荷をかけ、vmstat コマンドでボトルネックを特定します。
また、より詳細な情報を確認できる mpstat, iostat, free コマンドも合わせて紹介します。
CPU の待ち
プロセス (実行中のプログラム) は、以下の状態を遷移します。
プロセスが CPU を使っている場合、他のプロセスは「実行可能」状態で待たされます。
検証: CPU に負荷をかける
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
赤線部分に注目してください。
mpstat: CPU コア毎の情報
CPU コア毎の情報がほしい場合、mpstat コマンドを使います。
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 が完了するまで「待機」状態で待たされます。
検証: ストレージに負荷をかける
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
赤線部分に注目してください。
iostat: I/O のパフォーマンス
ストレージ (ディスク) I/O のパフォーマンスを確認する場合は、iostat コマンドを使います。
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 で実行するには、プロセスをメモリに置く必要があります。
この時、物理メモリのスペースが足りなくなると、使っていないプロセスをストレージのスワップファイルに退避させます。これをスワッピングと言います。
ストレージへのアクセスは時間のかかる処理のため、スワッピングは処理が遅くなります。
検証: メモリに負荷をかける
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 コマンドを使います。
total used free shared buff/cache available Mem: 965 879 55 0 31 1 Swap: 4095 430 3665
リソースを占有するプロセスを特定 top
リソースを占有するプロセスを特定する場合、top, iotop コマンドを利用します。
CPU を独占する場合
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 全体の情報です。
ストレージ I/O を独占する場合
ストレージ (ディスク) I/O は top コマンドで見れないので、iotop コマンドで確認します。
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 全体の情報です。
- Total DISK WRITE: プロセスがカーネルに書き込んだ合計が 60.19 M/s
- Actual DISK WRITE: カーネルがストレージに書き込んだ合計が 64.34 M/s
以下が個別プロセスの情報です。
- DISK WRITE: プロセスは約 8M/s で書き込む
- IO: プロセスが I/O リクエストに費やした時間の割合が約 99%
- COMMAND: ボトルネックとなるコマンドは stress -d 8 -q
メモリを独占する場合
%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 コマンドを利用します。
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 の基本1】初心者向け Linux コマンドの一覧
- 【Linux の基本2】ファイルシステム階層標準
- 【Linux の基本3】パッケージ管理システム (yum)
- 【Linux の基本4】init システム (systemd)
- 【Linux の基本5】ロギング (systemd-journald)
- 【Linux カーネル: OS 入門1】OS、カーネルとは
- 【Linux カーネル: OS 入門2】CPU・プロセス管理
- 【Linux カーネル: OS 入門3】メモリ管理
- 【Linux カーネル: OS 入門4】ストレージ管理・ファイルシステム
- 【Linux カーネル: OS 入門5】ファイルシステムの機能一覧
- 【Linux カーネル: OS 入門6】I/O デバイス管理