簡體   English   中英

PoolingHttpClientConnectionManager的Java Apache HTTPClient TIME_WAIT性能問題

[英]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

因此,您需要確保:

  • 在目標服務器上啟用了保持活動狀態(請檢查“保持活動狀態” HTTP標頭)
  • 您重用httpClient
  • TIME_WAIT中的套接字是由您生成的,而不是服務器上的另一個進程

這是一段對我有用的代碼,與您的代碼幾乎相同:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM