2016-12-19 12 views
0

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接続が再利用されていないようですか?

なぜでしょうか?

答えて

0

これは動作するようにする、httpキープアライブ機能です。 通常、Apache http-componentsでは、キープアライブがデフォルトで有効になっているので、現在のコードで問題ありません。

は、あなたがいることを確認する必要があります。

  • は生き続ける
  • (キープアライブHTTPヘッダを確認してください)先サーバー上で有効になっているあなたはTIME_WAITにHttpClientを
  • にソケットを再利用していますあなたによって生成され、これが私のために動作するコードの部分がある

サーバー上ではない別のプロセスでは、それはあなたのものとほとんど同じです。

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コンポーネントのキープアライブstartegyカスタマイズすることができます:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.htmlを - 章2.6を参照してください - 接続生かした戦略を保つ

詳細情報はここで見つけることができます:http://www.baeldung.com/httpclient-connection-management

+0

@loicmathieuこんにちは、お返事 に感謝 - 私たちは、サーバーからキープアライブヘッダーを受信して​​います。 "キープアライブタイムアウト= 15、最大= 100"と "接続:キープアライブ"。 - HTTPClientを再利用しています - TIME_WAITを確認する必要があります – ptimson

関連する問題