私は数年前から JMeter を使用しており、推奨される実装であると思われる Apache HTTPClient サンプラー実装を使用しており、Apache HTTPClient は成熟したコンポーネントです。しかし、最近 (まったく偶然にも)、Java 実装の方がパフォーマンスと拡張性に優れているように見えることを発見しました。
社内で開発された Java サーバー アプリケーションに対してテストしています。JMeter を HTTP サンプラーの HTTPClient4 実装から Java 実装に切り替えると、スループットが 400% ~ 450% 向上します。バージョン 2.7 と 2.9 をテストしました (2.9 では、HTTPClient4 が HTTP Sampler のデフォルトの実装になりました)。Red Hat Enterprise Linux (2.6.32-358.el6.x86_64) を実行する JMeter (Dual Intel(R) Xeon(R) E5-2640 0 @ 2.50GHz、6 コア、ハイパースレッド) をホストするために、かなり強力なマシンを使用しています。 ) と、テスト対象のサーバー アプリケーションをホストする同一のマシン。
仮想ユーザーの負荷を 1、10、25、50、100、150、200、250、300 のステップで 1 から 300 にスケーリングする一連のテストを実行します。各テストは個別であり、連続的なランプではありません。HTTPClient サンプラーを使用している場合、top を見ると、仮想ユーザーの負荷に関係なく (もちろんシングル ユーザーを除く)、JMeter が 700% から 1100% の間で使用されていることがわかります。Java 実装では、CPU 使用率が高くなります (1600% 以上)。jmx ファイルの HTTP 実装のみをテストごとに変更し、他には何も変更しないという点で、テストが同一であることに注意することが重要です。テスト中のサーバーは、すべてのことを公平にするために、テストとテストのために再起動されます。
テスト中のサーバーを監視すると、HTTPClient4 実装よりも Java HTTP サンプラーを使用する JMeter の方が CPU 使用率も高いことがわかります。Java impl が HTTPClient4 よりも多くのリクエストを同時に送信していることを示唆しています。ユーザー負荷が高く、HTTPClient4 impl を使用すると、テスト対象のサーバーは最大で 100% の CPU 使用率で実行されます。一度に 1 つの CPU/コア/ハードウェア スレッドのみを使用していることを示唆しています。おそらく、リクエストの応答時間が非常に速いことに注意することが重要です。90 パーセンタイルの応答時間は 2 ~ 25 ミリ秒の範囲です。
私はグーグル、ここ、および他のサイトで調査して理由を判断しました(時間が許せばJMeterのプロファイリングを試みるかもしれません)。私の最初の理論は、Java impl は HTTPClient よりも接続を再利用するのに効率的であるということですか? それとも、機能が豊富な HTTPClient によってパフォーマンスが低下するのでしょうか? 私の質問は 2 つあると思います。1) 他の誰かがこれを経験していますか? 2) Java impl のパフォーマンスがはるかに優れているように見える理由について、誰か理論や説明がありますか?
ありがとう!