Apache HTTPClientをPoolingHttpClientConnectionManagerと共に使用し、ルートごとに(同じエンドポイントを呼び出すなどして)サイズ200と200の接続プールを作成しています。Java Apache HTTPClient TIME_WAITのパフォーマンスに関する問題PoolingHttpClientConnectionManager
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registryBuilder.build());
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(200);
httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
HTTPClientはシングルトンクラスにラップされているため(HTTPClientが共有されているため)私はこれを使ってGETリクエストを行い、ステータスコードと本文で応答します。
public ResponseEntity<String> get(String url, Map<String, String> headers) throws IOException {
HttpGet httpget = new HttpGet(url);
httpget.setConfig(requestConfig);
headers.forEach(httpget::addHeader);
ResponseHandler<ResponseEntity<String>> responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String body = entity != null ? EntityUtils.toString(entity) : null;
return new ResponseEntity<>(body, HttpStatus.valueOf(status));
};
return httpClient.execute(httpget, responseHandler);
}
は、しかし、マシンが高CPU負荷の下であり、私たちは(私たちの目標は、1000年TPSである)netstat
で約3万TIME_WAIT
ソケットをヒットしていると、わずか約250 TPSに到達することができます。
30,000の音からTIME_WAIT
接続が再利用されていないようですか?
なぜでしょうか?
@loicmathieuこんにちは、お返事 に感謝 - 私たちは、サーバーからキープアライブヘッダーを受信しています。 "キープアライブタイムアウト= 15、最大= 100"と "接続:キープアライブ"。 - HTTPClientを再利用しています - TIME_WAITを確認する必要があります – ptimson