プログラマ 福重 伸太朗 〜基本へ帰ろう〜 このページをアンテナに追加 RSSフィード

2009-04-19

JMeterを利用した負荷テストでどのようにスレッド数、Ramp-Up期間、ループ回数をどうやって決めるか考える

what

前回の測定は、Ramp-Up期間がすべて 1 という極端なものであり、あまりよろしくないと聞いた。

そのため、再度、負荷テストを行う。

今回行いたい測定は、前回同様「サーバの負荷限界値」である。


負荷計測環境

前回とほぼ同じだが、負荷テスト対象のWebアプリケーションのバージョンが少々あがっている。


妥当なRamp-Up期間の決定について

JMeterで負荷テストするのはいいのだが、以下の数値をどのように決めるのに非常に悩む。


どうしたらよいものか、考えてみた。


Computerworld - エンタープライズITの総合ニュースサイト

上記にテストシナリオ作成のヒントが書いてあるので読んでみた。「現実に即したテスト」という視点が非常に重要であると書いてある。

記事のヒット率の以下のようになる。


  • スレッド数が大きい場合は、Ramp-Up期間を「0」に設定すべきではない。(異常な状態が好ましくない 。現実に即したものだとは言えない。 ヒット率の初期値が異常に高くなってしまう。)
  • 「ヒット率の初期値を、できるだけヒット率の平均値に近い値に保つこと」が重要である。
  • Ramp-Up期間が大きすぎるのも問題である。(ピーク時の負荷が過小評価されてしまう可能性がある)

実は、これからテストを行おうとしているアプリケーションは本番で数年走っているものであり、「ヒット率の平均値」はログを見れば分かる。

それは、「10ヒット/秒」である。


しかし、今回の負荷テストは「限界値」を求めるため、スタート値を平均ヒット率の2倍の 「 20 」まで上げて、テストしてみようと思う。2倍と軽々しく上げる理由は前回スループットが160と出ているためである。


スレッド数が100で、ヒット率が20ヒット/秒と推定した場合、理想的なRamp-Up期間の推定値は、100÷20=5秒となる。

これで、以下のテストしてみようと思う。


負荷テスト

リクエスト
名称対象サーバポート番号プロトコルメソッドパスその他(自動リダイレクトリダイレクトに対応、!KeepAliveを有効にする、など)
リクエストA192.168.0.580httpGET/a/bbbすべてOFF
リクエストB192.168.0.580httpGET/a/cccすべてOFF

今回は、2つのリクエストパターンを同時に走らせる。


スレッドプロパティ
回数スレッド数(リクエスト数×スレッド数=スレッド数合計)Ramp-Up期間(秒)(スレッド数合計/ヒット率の平均値ループ回数
1回目600(2×600=1200) 60(1200÷20=60) 1
2回目1200(2×1200=2400) 60(2400÷40=60) 1
3回目1800(2×1800=3600) 60(3600÷60=60) 1
4回目2400(2×2400=4800) 60(4800÷80=60) 1
5回目3000(2×3000=6000) 60(6000÷100=60) 1
6回目3300(2×3300=6600) 60(6600÷110=60) 1
7回目3600(2×3600=7200) 60(7200÷120=60) 1
8回目3900(2×3900=7800) 60(7800÷130=60) 1

上記のテストだと、ヒット率が期待するスループットになります。


実際には、以下のことも考慮してテストシナリオを作成することも重要であると書いてあるが、とりあえず無視してやってみる。

  • ユーザーの思考時間の考慮
  • レスポンス時間の要件定義


負荷計測結果
  • 1回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA6001917269870.010.0078394742548331.3780325838573548
リクエストB6001816249880.010.0073387150577080.9870519631062779
合計12001916259880.020.0083368070029162.364266360983743
  • 2回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA120020182691100.020.0106723585912472.755375783751334
リクエストB120019162591090.020.0106723585912471.9737088947438632
合計240019172591100.040.00733467802434.727429195352482
  • 3回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA180022203292430.030.0095030092862744.132167894833364
リクエストB179920163191130.030.0213603898271162.961091210324745
合計359921183192430.060.002334072456277.090445177431186
  • 4回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA240031235493080.039.996000399965.507261773822617
リクエストB2398292349102900.039.989327285461763.944259820148084
合計479830235293080.079.958670799586719.448892350348299
  • 5回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA30006754127123970.049.984171678968336.882586139389193
リクエストB29986554123113160.049.968332277742594.928517148488283
合計59986654125113970.099.915043893988111.807018196848295
  • 6回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA33001428137625861832670.052.554465537011087.236503555389222
リクエストB31491422137425581233430.050.219280759110124.9532689029981665
合計64491425137525741233430.0102.7041661358134812.182909571482035
  • 7回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA360036853792543313209980.002222222222222222252.62003946502967.382107359497185
リクエストB320636893799543938210140.002807236431690580346.881626087592314.782921373473715
合計680636873793543513210140.002497796062297972499.481107944164312.162931420375648
  • 8回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA3900532450941204721257670.0354.260114641883259.37258699009405
リクエストB3332537350941333823256510.02881152460984393746.405392607448266.190907373750035
合計7232534750941275921257670.029452433628318585100.6177305359229715.55712050962769

負荷計測結果分析

結果 Throughput は おおよそ100 でした。

5回目の負荷テストまではスループットがそのまま素直に出ますが、6回目以降のテストでは、スループットは99〜102しか出ません。

このパターンのリクエストであれば、論理上1日8,640,000(100*60*60*24)リクエストさばけることになります。


Ramp-Up 0 でテスト

前回、Ramp-Up 1 で行ったが、それはよろしくないということで今回は Ramp-Upを 60 に設定して行ったのだが、ためしに Ramp-Up 0 で行ったらどうなるのか試してみた。


リクエスト

同じ

スレッドプロパティ
回数スレッド数(リクエスト数×スレッド数=スレッド数合計)Ramp-Up期間(秒)ループ回数
1回目1(2×1=2) 0 1
2回目200(2×200=400) 0 1
3回目400(2×400=800) 0 1
4回目600(2×600=1200) 0 1
5回目1000(2×1000=2000) 0 1
6回目1500(2×1500=3000) 0 1
7回目2000(2×2000=4000) 0 1
Ramp-Up 0 の負荷テスト結果
  • 1回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA142424242420.023.8095238095238073.278459821428571
リクエストB114141414140.071.428571428571437.045200892857142
合計228424214420.034.482758620689654.074622844827586
  • 2回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA2001051104217445120940.083.8926174496644311.551620176174497
リクエストB20018021824204943523200.050.581689428426914.9890142893272635
合計4001426164219705123200.099.8253057149987611.79576366358872
  • 3回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA4002053201435955642740.083.5596406935450211.505770837685398
リクエストB40035353696400955742820.051.0920934985311065.039356878273088
合計8002794332539255642820.0101.4455997971088111.987224194775552
  • 4回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA60031132922520560109610.051.4844688518963457.089170027458383
リクエストB60050015099548923109170.051.657339647008185.095108695652174
合計120040574771544523109610.0102.7573214591539612.14222255523206
  • 5回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA10007210485614088112218210.043.7579311250164056.025262000612611
リクエストB100045484831541323215000.043.940592319184464.333984203357061
合計2000587948361307323218210.087.3896705409420610.326318491654288
  • 6回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA150011069889521344115215920.300666666666666765.8067912608581232.170609590243046
リクエストB1500509438191226916215600.03733333333333333656.569618343641578.128788985895309
合計3000808250782115416215920.169112.6295239525454335.62245996959003
  • 7回目
Label# SamplesAverageMedian90% LineMinMaxError %ThroughputKB/sec
リクエストA200012438138912132071255940.37370.3383273545755140.32831513329113
リクエストB20006536502514052296252570.06665.8739830703863411.745125325252792
合計4000948757552123471255940.2195131.4319511073141849.39505364066505

2〜4回目はスループットが 100 近くを示しており、今回の結果に近い値が出ている。しかし、エラーが出始める6回目以降は、正しいレスポンスが帰ってこないため、スループットが高めになっています。では、エラーが 0% のところのスループットを参考にすればよいのかといえばそうでもなく、5回目はエラーが 0% にもかかわらずスループットは 87 と出ています。よって Ramp-Up 0 による計測は、Ramp-Upが 60 のときより、計測しにくいという結果になりました。とはいえ、100に近い数字が出ていますので、参考にならないわけではありませんね・・・。


まとめ

Ramp-Up 0 というのは計測しにくいという結果になった。ただ、瞬間的な負荷(ピーク時の負荷)が過小評価されるのもよろしくないので、完全に無視できるものでもない。

負荷テストのパターンは山のようにあるため、正解というのはないと思うが、実際そのサーバが現実にどのような負荷を想定するかが重要であると思った。その結果が利用者にとって一番意味のあるデータだからだ。


サーバの負荷のタイミング、流れについて整理すると以下のようになる。


サービスが動いているサービスのスループット取得

1. 現在のログを分析して、リクエスト状況の調査

2. その調査に基づき、負荷テストシナリオを作成する

3. (多くは本番環境ではできないとおもうのでデモ環境で)負荷テスト実行

4. 現在、どのくらいのスループットなのかが取得できる。


サービスリリース前のスループット取得

1. リクエスト状況の想定

2. その想定に基づき、負荷テストシナリオを作成する

3. 本番のサーバ環境で負荷テスト実行。

4. 現在、どのくらいのスループットなのかが取得できる。


スループット取得後

1. サーバ負荷(リクエスト/秒、ロードアベレージ、CPU、メモリ、I/Oなど)を監視する。

2. (sarなどを見て)負荷が高くなってきたら、サーバを改善してより多くの負荷に耐えられるようにする。(メモリ増強、I/O負荷軽減、スケールアウト、アプリケーションの改造など)。

3. 現在のログを分析して、リクエスト状況の把握。

4. 新しくなったサーバ性能、アプリケーション性能の環境(多くは本番環境ではできないとおもうのでデモ環境)で、負荷テスト実施。

5. 現在、どのくらいのスループットなのかが取得できる。



負荷テストについて、まだまだ分からないことだらけなので、突っ込みお願いします><

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証