[英]Java Apache HTTPClient TIME_WAIT performance issues with PoolingHttpClientConnectionManager
我們將Apache HTTPClient與PoolingHttpClientConnectionManager一起使用,並為每個路由創建大小分別為200和200的連接池(調用相同的端點)。
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高負載下,因此我們在netstat
中命中了大約30,000個TIME_WAIT
套接字,並且只能達到大約250 TPS(我們的目標是1000 TPS)。
從30,000 TIME_WAIT
的聲音看來,連接是否沒有被重用?
有什么想法嗎?
這是http保持活動功能,可以使其起作用。 通常,您的當前代碼應該可以,因為默認情況下Apache HTTP-components中啟用了keep-alive 。
因此,您需要確保:
這是一段對我有用的代碼,與您的代碼幾乎相同:
DefaultHttpClient httpclient = new DefaultHttpClient();
PoolingClientConnectionManager pool = new PoolingClientConnectionManager(httpclient.getConnectionManager().getSchemeRegistry());
pool.setMaxTotal(5000);
pool.setDefaultMaxPerRoute(1000);
HttpParams params = httpclient.getParams();
httpclient = new DefaultHttpClient(pool, params);
如果不起作用,則可能是您連接的服務器不支持保持活動狀態(在這種情況下它將永遠無法工作)或不支持非標准保持活動狀態,在這種最新情況下,您可以自定義保持活動狀態Apache http-components的初學者: https ://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html-請參閱第2.6章-連接保持活動策略
可以在這里找到更多信息: http : //www.baeldung.com/httpclient-connection-management
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.