話題の記事

EC2でサーバーに負荷を発生させる stress ツールを使ってみる

2014.12.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。Amazon Linux AMI 2014.09がリリースされて随分と経ちましたが、リリースノートにちょっと目を引いた記載がありました。

New packages In addition to the features above, here are some other new packages added based on customer requests: : stress-1.0.4 :

stressというのはCPUやメモリーの負荷を発生させるツールです。サーバーの高負荷状態でのアプリケーション挙動を確認する際に使用します。便利なツールなので使い方をおさらいしてみました。

stressの使い方

プロジェクトページ

stressツールのプロジェクトページはこちらです。

インストール

インストールはyumで簡単にインストールできます。設定ファイルの作成等も不要です。

$ sudo yum install stress -y
$ stress --version
stress 1.0.4

manページ

stressの詳しい使い方はmanページをご覧ください。以下の説明ではmanページの内容を掲載しています。

$ man stress

CPU(ユーザー)に負荷をかける

アプリケーションレベルでCPU高負荷状態にしたい場合に指定します。

stress -c
              spawn N workers spinning on sqrt()

以下のコマンドで1つのプロセスがひたすらsqrtを実行してCPU使用率(ユーザー)を高くしてくれます。

$ stress -c 1

CPU(システム)に負荷をかける

システムコールやカーネルスレッドレベルでCPU高負荷状態にしたい場合に指定します。

stress -i
              spawn N workers spinning on sync()

以下のコマンドで1つのプロセスがひたすらsync(キャッシュをディスクに書き込む)を実行してCPU使用率(システム)を高くしてくれます。ただCPU(システム)が単独で高負荷になる状態というのはあまり経験がないです(メモリーが不足してスワップしていることで高くなっているケースが多い)。

$ stress -i 1

メモリーを消費する

メモリーを大量に消費したい場合に指定します。デフォルトではワーカー1つにつき、256MBのメモリーを確保しますが--vm-bytesで指定可能です。

stress -m 
              spawn N workers spinning on malloc()/free()
--vm-bytes B
              malloc B bytes per vm worker (default is 256MB)

以下のコマンドで4つのプロセスが512MBずつメモリーを確保しては解放します。

$ stress -m 4 --vm-bytes 512M

ディスクIOに負荷をかける

ディスクIO待ちにしたい場合に指定します。デフォルトではワーカー1つにつき、1GBの書き込みを行いますが--hdd-bytesで指定可能です。

stress -d
              spawn N workers spinning on write()/unlink()
--hdd-bytes B
              write B bytes per hdd worker (default is 1GB)

以下のコマンドで2つのプロセスが2GBずつディスクへの書き込みを行います。topやvmstatのCPU(Wait)を高い状態にします。

$ stress -d 2 --hdd-bytes 2G

CPUに負荷をかけてみる

試しにt2.microのインスタンスでワーカーを1つだけ起動してCPUに負荷をかけてみました。

stressを実行した状態で、別のsshセッションからvmstatを実行してみます。CPUに負荷がかかり始めると、一番左のprocs - r(Running processes) が1になり、cpuus(CPU USer)が100%になることが分かります。代わりにcpu id(CPU IDle)はゼロになっていますね。

$ stress -c 1
stress: info: [22269] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
$ vmstat -t 1
procs -----------memory---------- ---swap-- -----io---- --system--  -----cpu------  ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us sy  id wa st
 0  0      0 531464  14980 408656    0    0     0     0    7   11   0  0 100  0  0  2014-11-01 04:22:26 UTC
 0  0      0 531464  14980 408656    0    0     0     0    8   10   0  0 100  0  0  2014-11-01 04:22:27 UTC
 1  0      0 531324  14980 408656    0    0     0     0   94   39  30  0  70  0  0  2014-11-01 04:22:28 UTC
 1  0      0 531324  14980 408656    0    0     0     0  253   19 100  0   0  0  0  2014-11-01 04:22:29 UTC
 1  0      0 531324  14980 408656    0    0     0     0  254   25  99  0   0  0  1  2014-11-01 04:22:30 UTC
 1  0      0 531324  14988 408656    0    0     0    12  255   23 100  0   0  0  0  2014-11-01 04:22:31 UTC

さらに30分ほどCPUを使い続け、t2.microのCPU Credit Balanceを使い切ってみましょう。cpuus(CPU USer)が20%程度に下がり、代わりにst(STeal)が高騰することが分かります。

procs -----------memory---------- ---swap-- -----io---- --system--  -----cpu------  ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us sy  id wa st
 2  0      0 527808  18580 408952    0    0     0     0   52   10  18  0   0  0 82  2014-11-01 05:07:03 UTC
 1  0      0 527808  18580 408952    0    0     0     0   52   13  18  0   0  0 82  2014-11-01 05:07:04 UTC
 1  0      0 527808  18588 408952    0    0     0    20   54   19  18  0   0  0 82  2014-11-01 05:07:05 UTC
 2  0      0 527808  18588 408952    0    0     0     0   52   13  18  0   0  0 82  2014-11-01 05:07:06 UTC
 2  0      0 527808  18588 408952    0    0     0     0   52   19  17  0   0  0 83  2014-11-01 05:07:07 UTC
 1  0      0 527808  18588 408952    0    0     0     0   51   12  18  0   0  0 82  2014-11-01 05:07:08 UTC

CPU Creditを使いきってしまっているために、EC2(仮想OS)がCPUを要求しても仮想ホストがリソースを割り当てていないこと(stealがあがる)が読み取れます。

まとめ

stressツールを使うことで、高負荷時のサーバーの状態を簡単に再現することができます。重要なシステムについては、様々な高負荷状態でアプリケーションを実行し挙動を確認しておく良いでしょう。特に例で示したように、思いがけずCPU Creditを使い切ってしまった場合にどのような挙動をするのか把握しておくこと(サービス停止やデータ不整合が起きないこと)が重要だと思います。ぜひご活用ください。