Methodology & Design Article
テスト・スクリプト改善のヒント
JMeterの使いこなし方、テスト条件の統計的定義手法を学ぶ
「JMeter」は、Apache Jakartaプロジェクトが開発/提供するオープンソースの負荷テスト・ツール。GUIベースで負荷テスト用のスクリプトを作成することができ、その作業自体は決して難しいものではない。ただし、実際のシステムにおける負荷をモデル化してスクリプトを生成するとなると、難易度は格段に高くなる。その理由の1つは、モデル化に重大な影響を及ぼすJMeterのエレメント(要素)がわかりづらいものであることだ。本稿では、そうした点を解消するとともに、負荷テストにおけるレスポンス時間の要件定義に適用すべき指針を提供する。
2006年5月15日更新
Ramp-Up期間の決定方法
JMeterでテスト条件(スクリプト)を定義する際、最初に必要となるエレメントは、スレッドグループである。そこで、まずはこのエレメントについて説明することにしよう。スレッドグループには、以下のパラメータが含まれている。
●スレッド数
●Ramp-Up期間
●ループ回数
これらのうち、Ramp-Up期間には、JMeterがすべてのスレッドを生成し終わるまでの所要時間を指定する。そのデフォルト値は「0」である。つまり、Ramp-Up期間が指定されなかった場合、その値は「0」となり、JMeterはすべてのスレッドを即時に生成する。一方、Ramp-Up期間がT秒に設定された場合、合計スレッド数がNであるとすると、JMeterはT/N秒ごとにスレッドを生成する。
おそらく、JMeterを利用する際には、このRamp-Up期間の設定で悩むことになるだろう。と言うのも、その適切な値が必ずしも明確ではないからだ。そこで、以下では、この設定に関するノウハウを明らかにしたい。
まず、スレッド数が大きい場合は、Ramp-Up期間を「0」に設定すべきではない。Ramp-Up期間が「0」の場合、JMeterは負荷テストの開始時に、すべてのスレッドを一度に生成し、即座にリクエストを送信する。スレッド数が大きいと、これにより、サーバが飽和してしまう危険性があるのだ。さらに、そうした負荷の増大は、決して現実に即したものだとは言えない。この点がより重要である。つまり、そうした場合にサーバが過負荷状態に陥る理由は、ヒット率(単位時間当たりのリクエスト数)の平均値が高くなるからではなく、すべてのスレッドの最初のリクエストが同時に送信されるために、ヒット率の初期値が異常に高くなってしまうからなのだ(これを実際に確認するには、後述するリスナーの1つ、「統計レポート」を使用する)。
上述したような異常な状態が好ましくないのは明らかである。そこで、ここでは妥当なRamp-Up期間を決定するための経験則をご紹介しよう。それは、「ヒット率の初期値を、できるだけヒット率の平均値に近い値に保つこと」である。もちろん、そのような妥当な値を見つけ出すには、テスト計画を一度実行してみる必要があるだろう。
同様の理由により、Ramp-Up期間が大きすぎるのも問題である。なぜなら、ピーク時の負荷が過小評価されてしまう可能性があるからだ。つまり、すでに実行し終わったスレッドが存在する一方で、まだ開始さえしていないスレッドが存在するといった状況に陥る危険性があるということである。
それでは、Ramp-Up期間が小さすぎず、かつ大きすぎないようにするには、どのようにすればよいのだろうか。以下に、その手順を説明しよう。
まず、ヒット率の平均値を推定し、スレッド数をその値で割ることにより、Ramp-Up期間の初期値を計算する。例えば、スレッド数が100で、ヒット率が10ヒット/秒と推定した場合、理想的なRamp-Up期間の推定値は、100÷10=10秒となる。それでは、ヒット率はどのようにして推定すればよいのだろう。実は、そのための簡単な方法は存在しない。とにかく、まずはテスト・スクリプトを一度実行してみることである。
続いて、リスナーの1つである「統計レポート」をテスト計画に追加する。同リスナーでは、リクエスト(サンプラー)ごとに、ヒット率の平均値が表示される(画面1)。
|
なお、最初のサンプラー(HTTPリクエストなど)のヒット率は、Ramp-Up期間とスレッド数に密接に関係している。そこで、Ramp-Up期間を調整することにより、テスト計画の最初のサンプラーのヒット率が、その他すべてのサンプラーのヒット率の平均値に近い値になるようにする。
最後に、JMeterログ(JMETER_HOME/binディレクトリ内に存在するjmeter.log)を開き、最初に終了したスレッドの終了時刻が、最後に開始されたスレッドの開始時刻よりも後になっていることを確認する。なお、両時刻の間隔は、できるだけ大きいほうが望ましい。
以上をまとめると、適切なRamp-Up時間を決定するための原則は、次の2つとなる。
●最初のサンプラーのヒット率をその他のサンプラーのヒット率の平均値に近づけること。この原則に従えば、Ramp-Up期間として、小さすぎる値を設定してしまうことがなくなる
●最初に終了したスレッドの終了時刻が、最後に開始されたスレッドの開始時刻よりも後になるようにすること。なお、両時刻の間隔はできるだけ大きいほうが望ましい。この原則に従えば、Ramp-Up期間に大きすぎる値を設定してしまうことがなくなる
なお、上記の両原則が互いに競合する場合もある。つまり、両方の原則を満たすRamp-Up期間が存在しないケースがありうるのだ。実は、単純なテスト計画では、この問題が発生しやすい。なぜなら、単純なテスト計画では、1スレッド当たりのサンプラー数が少ないため、テスト計画が短すぎてスレッドの実行が短時間で終了してしまうからだ。









