🔥

負荷テストのための stress

2022/12/23に公開

はじめに

インスタンスに負荷をかけてインスタンスのスケールアウトを行うのに負荷をかけて検証をしていた時に stress コマンドを使用していたのでまとめとして記載します。今回はCPU、Memory, Diskに絞ってみていきます。

検証環境

OS: debian
CPU: 4core

stress コマンド

stressコマンドは、負荷テストを行うツールです。stressコマンドを使用することで、Unix 系 OS で動作しているホストのCPU,Memory や Disk に簡単に負荷をかけることができます。

インストール

apt install -y stress

CPUに負荷をかける

負荷をかける前に vmstat コマンドでCPUの負荷を確認しておく。

azureuser@demoVM:~$ vmstat 2
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 14409872  38432 1514244    0    0   116   867   62  163  1  1 97  1  0
 0  0      0 14409872  38432 1514268    0    0     0     0   90  200  0  0 100  0  0
 0  0      0 14409872  38440 1514268    0    0     0    32   38  169  0  0 100  0  0
 0  0      0 14409872  38440 1514268    0    0     0     2   50  179  0  0 100  0  0
 0  0      0 14409872  38440 1514268    0    0     0   166   35  164  0  0 100  0  0
 0  0      0 14410128  38448 1514268    0    0     0    20  209 1076  0  0 99  0  0
 0  0      0 14410128  38448 1514268    0    0     0     2   54  177  0  0 100  0  0
 0  0      0 14410128  38448 1514268    0    0     0     0   29  159  0  0 100  0  0

cpuのid(アイドル状態)を見て100に近いということで、CPU の使用率がほとんどないことがわかります。
そこで、今回 4core CPUなので以下のコマンドで 50% 負荷をかけてみます。

stress -c 2

負荷をかけた後再度 vmstat で値を見てみます。

azureuser@demoVM:~$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 14405780  38908 1514284    0    0    98   731   55  146  2  1 97  1  0
 2  0      0 14405780  38908 1514284    0    0     0     0  277  139 50  0 50  0  0
 2  0      0 14405780  38916 1514268    0    0     0    20  290  171 50  0 50  0  0
 2  0      0 14405780  38916 1514268    0    0     0     0  264  123 50  0 50  0  0
 2  0      0 14405780  38916 1514268    0    0     0     0  272  132 50  0 50  0  0
 2  0      0 14405780  38924 1514268    0    0     0    80  298  175 50  0 50  0  0

すると、CPU の id の列が先ほどとは変わって 50 になっているため、50% 使用しているということになります。これを Azure Monitor で見てみるとこんな感じになります。

cpu_monitoring

Memoryに負荷をかける

次に、memory に対して負荷をかけていきます。stressコマンドの --vm オプションで今回は 2VM 指定して負荷をかけていきます。
stress コマンドでの memory に対するデフォルトの挙動としては メモリ確保 -> メモリ開放を繰り返します。

今回も負荷をかける前の値を取得しておきます。今回は dstat コマンドを使用してmemoryの値を取得します。

azureuser@demoVM:~$ dstat -m
------memory-usage-----
 used  free  buff  cach
 428M 13.7G 40.6M 1443M
 426M 13.7G 40.6M 1443M
 426M 13.7G 40.6M 1443M
 426M 13.7G 40.6M 1443M
 426M 13.7G 40.6M 1443M
 426M 13.7G 40.6M 1443M

では、以下のコマンドで、負荷をかけていきます。1vm あたり デフォルトで 256GB になっているので、変更する際は --vm-bytes オプションで --vm-byte 512のように変更します。

stress --vm 2

負荷をかけた結果以下のようになりました。負荷をかけて used の値が増えていることがわかります。

azureuser@demoVM:~$ dstat -m
------memory-usage-----
 used  free  buff  cach
 432M 13.7G 40.7M 1443M
 432M 13.7G 40.7M 1443M
 432M 13.7G 40.7M 1443M
 433M 13.7G 40.7M 1443M
 521M 13.6G 40.7M 1443M
 612M 13.5G 40.7M 1443M
 764M 13.3G 40.7M 1443M
 601M 13.5G 40.7M 1443M
 708M 13.4G 40.7M 1443M
 556M 13.6G 40.7M 1443M

オプションはほかにも、 メモリ確保を維持する --vm-hang等もある。

Diskに負荷をかける

最後にDiskに負荷をかけていきます。 stressコマンドの --hdd オプションを使用してDiskに負荷をかけていきます。diskに対するデフォルトの挙動は、diskに書き込み -> 削除 の繰り返しをします。
では、負荷をかける前の値を取得してみます。

azureuser@demoVM:~$ dstat -r
--io/total-
 read  writ
3.29  18.0
   0     0
   0     0
   0     0
   0     0
   0  1.00

それでは負荷をかけてみます。 --hdd オプションで負荷を指定します。デフォルトでは1GB になっているので、変更する際は --hdd-bytes 2G(2GB)のように --hdd-bytes オプションを併用します。

stress --hdd 2

負荷をかけた結果以下のようになりました。負荷をかけて writ の値が増えているのがわかります。

azureuser@demoVM:~$ dstat -r
--io/total-
 read  writ
3.27  17.9
   0   102
   0   134
   0   132
   0   116
   0   119
   0   119
   0   118

その他

-t, --timeout : 負荷をかける秒数を指定する
-n, --dry-run : 実際に負荷をかけず,期待値を確認する
-q, --quiet : 標準出力を抑制する
-v, --verbose : 標準出力にデバッグ情報まで表示する

上記のようなオプションもあるので、使用してみるものありかと思います。今回は使用した検証はありません。。。

Appendix

今回 負荷テストの確認で vmstat dstat をしようしたので、こちらを紹介します。

vmstat

カーネル・スレッド、仮想メモリー、ディスク、ハイパーバイザーのページ、トラップおよびプロセッサーのアクティビティーに関する統計情報を報告します。

# カラム 説明
1 r 実行中と実行待ち中のプロセス数の合計
2 b 割り込み不可能なスリープ状態にあるプロセス数
3 swpd 使用中の仮想メモリの量
4 free 空きメモリの量
5 buff バッファとして使用しているメモリの量
6 cache キャッシュに使用している量
7 si ディスクからスワップインしているメモリの量
8 so スワップアウトしている量
9 bi HDDのようなブロック型デバイスから受け取ったブロック数
10 bo ブロック型デバイスに送ったブロック数
11 in 1秒当たりの割り込み回数
12 cs コンテクストスイッチの回数
13 us カーネルコード以外の実行(ユーザー時間)に使用した時間(ユーザー時間)
14 sy カーネルコードの実行に使用した時間(システム時間)
15 id 空転していたアイドル時間
16 wa I/O待ち時間
17 st 仮想マシンから“盗まれた”時間 ※※

dstat

こちらに説明が乗っていたのでこちらは説明を省きます。

https://qiita.com/ryuichi1208/items/387fa1cba44690c3db9b

OSS:https://github.com/dstat-real/dstat

さいごに

今回は僕が個人的にインスタンスに負荷をかけていろいろ調査・検証をすることがあったので、その時に覚えたことを記載しています。ほぼメモとなってはおりますが・・・今回は stress コマンドの記事となりましたが、 stress-ng コマンドもあるのでそちらも記載できればと。。。

Discussion