このアプリケーションでは、1 秒あたり 5,000 リクエストを超えるリクエスト ボリュームを処理する必要があります。これは、私たちのタイプのアプリケーション (JSON-HTTP API をリモート システムに公開する必要がある場合) で Jetty を使用すると実現可能であると言われています。これにより、インバウンド リクエストと接続が開始されます。
数千のインバウンド HTTP 接続を受け取ります。それぞれの接続は永続的で、約 30 秒間続きます。次に、リモート サーバーは、これらの各接続で応答できる限り迅速に要求を送信します。30 秒後に接続が閉じられ、別の接続が開かれます。100 ミリ秒以内 (ネットワーク通過時間を含む) で応答する必要があります。
サーバーは EC2 で 8 GB の RAM を使用して実行され、そのうち 4 GB が Java VM に割り当てられます (過去の調査では、使用可能な RAM の半分以上を JVM に割り当てるべきではないことが示唆されています)。
Web で読んださまざまなヒントに基づいて、現在 Jetty を初期化する方法を次に示します。
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(config.listenPort);
connector.setThreadPool(new QueuedThreadPool(5120));
connector.setMaxIdleTime(600000);
connector.setRequestBufferSize(10000);
server.setConnectors(new Connector[] { connector });
server.setHandler(this);
server.start();
当初、スレッドプールには 512 スレッドしかありませんでした。5120 に増やしてみましたが、これはあまり役に立ちませんでした。
このセットアップでは、毎秒 300 を超えるリクエストを処理するのに苦労しています。ハンドラーは簡単な計算と Gson シリアライゼーション/デシリアライゼーションを実行しているだけなので、問題はハンドラーにあるとは思いません。
この負荷を処理しようとしているときに独自の HTTP 要求を手動で実行すると、応答が始まるまでに数秒かかることがあります。
Jetty バージョン 7.0.0.pre5 を使用しています。
解決策、またはボトルネックを特定するためのテクニックについての提案をいただければ幸いです。