負荷テストのための stress
はじめに
インスタンスに負荷をかけてインスタンスのスケールアウトを行うのに負荷をかけて検証をしていた時に 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
で見てみるとこんな感じになります。
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
こちらに説明が乗っていたのでこちらは説明を省きます。
OSS:https://github.com/dstat-real/dstat
さいごに
今回は僕が個人的にインスタンスに負荷をかけていろいろ調査・検証をすることがあったので、その時に覚えたことを記載しています。ほぼメモとなってはおりますが・・・今回は stress
コマンドの記事となりましたが、 stress-ng
コマンドもあるのでそちらも記載できればと。。。
Discussion