NTTデータ先端技術(株)
本考察では、JBentoStore V1.0に対し異なる種類の負荷生成ツールより負荷をかけ、スループット、応答時間、CPU使用率、GC時間についての比較から、JBentoGohan 1.0.0の有効性について述べる。比較対象となる負荷ツールを以下に示す。
負荷ツールにJMeterを利用してAPサーバクラスタの性能評価を行う場合、負荷クライアントネックになってしまう問題があった (関連する考察データ「JBentoStoreによるTomcatのレプリケーションモードについての考察」参照)。 そこで2006年度OSS活用基盤整備事業においてより軽量な負荷ツールJBentoGohanを開発した。
結果からは、JBentoGohanがJMeterに対し、性能面で有利であることが分かる。JBoss AS 4.0.5.GA Buddy Replication構成ではJMeterでは十分な負荷をかけることができないが、JBentoGohanでは十分な負荷をかけ、APサーバクラスタの性能が正しく測定できていることが分かる。
JMeterとJBentoGohanのスレッド/ソケット構成の比較を図1に示す。

図1 JMeterとJBentoGohanのスレッド/ソケット構成の比較
JMeterでは、Webサーバに対して接続する1コネクションごとに1スレッドを割り当てる。Webサーバから見ると、1コネクション=1クライアントとなるため、クライアント数を増やすとスレッド数が増えてしまうことになる。スレッドを増やし過ぎると、スレッド切り替えのコンテキストスイッチのオーバヘッドや、使用するメモリ量が多くなり、負荷ツールを動作させるマシンの負荷が高まってしまう。
JBentoGohanでは、Java SE 1.4から使用可能なJava NIOを使用して、1スレッドで複数のコネクションを処理する。そのため、クライアント数を増やしてもスレッド数は増やす必要は無く、スレッド切り替えのオーバヘッドや使用するメモリ量を抑えることができる。
なおCPUが複数ある場合にCPUを有効活用するために、JBentoGohanでは複数のスレッドを起動することも可能である。
以下では、JBoss AS 4.0.5.GA Buddy Replicationの8台構成に対し、JMeter/JBentoGohanで負荷をかけた結果を示す。なお、JMeterではFixed Delay、JBentoGohanはFixed Rateで思考時間500msで負荷をかけている。Fixed Delay、Fixed Rateの違いを図2に示す。

図2 Fixed DelayとFixed Rateの違い
Fixed Delayでは、レスポンスを受信した時点を基点として思考時間経過後、次のリクエストを送信する。そのため、応答時間が遅くなるとクライアント側でかけている負荷を下げてしまうことになり、全体的にスループットが理想値(クライアント数/思考時間)より低くなる傾向にある。一方Fixed Rateでは、レスポンスを送信した時点を基点として、思考時間経過後、次のリクエストを送信する。応答時間が思考時間として設定した値を超えない限り、スループットは理想値となる。実際のシステムではFixed Delayのモデルで負荷がかかることになるが、負荷試験においては、スループット/レスポンスタイム/理想値の関係を把握しやすいFixed Rateも多く使用される。
各測定データからスループットのグラフを比較する。横軸はJMeter/JBentoGohanのクライアント数、縦軸は1秒間あたりの処理リクエスト数(Throughput)である。
| JMeter | JBentoGohan |
|---|---|
![]() |
![]() |
グラフから読み取れることを、以下に示す。
各測定データから、応答時間のグラフを比較する。横軸はJMeter/JBentoGohanのクライアント数、縦軸は平均応答時間[ms]である。
| JMeter | JBentoGohan |
|---|---|
![]() |
![]() |
グラフから読み取れることを、以下に示す。
各測定データから、CPU使用率のグラフを比較する。横軸はJMeter/JBentoGohanのクライアント数、縦軸は平均CPU使用率である。
| JMeter | JBentoGohan |
|---|---|
![]() |
![]() |
kuma01が負荷ツールが動作するマシン、kuma02がWebサーバ、kuma03-kuma10がAPサーバである。グラフから読み取れることを、以下に示す。
各測定データから、JMeterネックとなった400クライアント時のkuma01(負荷ツールマシン)のFull GC時間のグラフを比較する。横軸は経過時間、縦軸はFull GCにかかった時間を積み上げた値である。
| Target | Full GC Time |
|---|---|
| JMeter | ![]() |
| JBentoGohan | ![]() |
JMeterでは、測定開始から数多くのFull GCが走っており、10分測定のうち1分近くをFull GCに費やしている。Full GCが起こるとJavaのアプリケーションスレッドが動作を停止するため、高負荷な試験においては、予期しないスループットの低減や、応答時間の極端な劣化が見られることになる。今回の検証結果において、平均応答時間が良いにも関わらずスループットが伸びていない理由は、Full GCによるものであったと想定される。
JBentoGohanでは測定期間内にFull GCは一回も起こっていない。
今回の比較から分かったことをまとめる。
測定に使用したJBentoGohanでは、1000クライアントにおいてもCPU使用率も低く抑えられ、十分な負荷をかけることができ、8台クラスタに対する性能試験も行うことができた。しかし、CPU使用率も低くはあるもののクライアント数に応じて上昇している。2000クライアント、3000クライアントというさらに高負荷な試験を行う場合には、JBentoGohanのさらなる軽量化や、複数サーバから負荷をかける機能が必要となってくるであろうことも分かった。
性能差としては、CPU使用率で4倍程度、JBentoGohanの方が有利なことが分かった。しかしJBentoGohanでは、HTTP1.1への対応やHTTPSでの負荷試験にまだ対応していない等の機能的な制約がある。またシナリオはJavaクラスで記述しなければならないなど、ユーザが使いやすい形にはなっていない。低負荷や簡単な測定に対してはJMeter、より高負荷な測定が必要な場合にはJBentoGohanと言った使い分けが有効だろう。