当前位置: 首页 > 知识库问答 >
问题:

PoolighttpClientConnectionManager的Java Apache HTTPClient时间等待性能问题

仉成益
2023-03-14

我们正在使用ApacheHttpClient和PoolighttpClientConnectionManager,并创建一个连接池,每个路由大小分别为200和200(调用同一个endpoint)。

    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)。

从30000<代码>TIME\u WAIT的声音来看,连接似乎没有被重复使用?

你知道为什么吗?

共有1个答案

益炜
2023-03-14

正是http保持活动的功能使这项功能得以实现。通常情况下,您当前的代码应该没有问题,因为在Apache http组件中默认启用了保持活动。

所以你需要确保:

  • 在目标服务器上启用了保持活动(检查保持活动http标头)
  • 您可以重新使用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组件的保持活动开始:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html-参见第2.6章-连接保持策略

更多信息可在此处找到:http://www.baeldung.com/httpclient-connection-management

 类似资料:
  • 我看到有一条eslint规则,,用于禁止。 在规则的描述中,它声明一个添加。 但是,当我查看MDN函数文档时,“简单示例”显示了一个包含的示例,但没有说明这可能是性能问题的原因。 是否如eslint文档所建议的那样是一个实际的性能问题? 如果是,怎么做?

  • 我使用async、await编写了一个Javascript代码,并在每个异步函数中使用try、catch。 假设如果我写了10个异步函数,那么我需要在所有这10个函数中写try,catch。现在我脑子里有一个问题,那就是它不会造成性能开销吗?

  • 我使用JMeter Webdriver采样器来测量应用程序UI响应时间。我正面临等待功能的问题。例如,登录页面的加载时间在10到120秒之间。因此,我有以下代码用于Webdriver sampler中的登录页面,以进行页面加载检查。 问题是即使在页面完全加载之后,JMeter仍然在等待执行下一个操作。如果我减少120秒,等待时间就会减少,但有时应用程序加载也需要120秒,所以我需要保持120秒。

  • 问题内容: 我看到有一条禁止的附庸制度。 在规则的描述中,它声明了一个add 。 但是,当我查看[MDN 函数docs时,“简单示例”显示了一个示例,其中没有任何说明这可能是性能问题的原因。 如eslint文档所建议的那样,是否存在实际的性能问题? 如果是这样,怎么办? 问题答案: 不,没有任何性能 问题 。这只是不必要的额外操作。执行可能需要更长的时间,但几乎不会引起注意。它类似于而不是整数。或

  • 之前介绍过的所有阻塞调用,将会阻塞一段不确定的时间,将线程挂起直到等待的事件发生。在很多情况下,这样的方式很不错,但是在其他一些情况下,你就需要限制一下线程等待的时间了。这允许你发送一些类似“我还存活”的信息,无论是对交互式用户,或是其他进程,亦或当用户放弃等待,你可以按下“取消”键直接终止等待。 介绍两种可能是你希望指定的超时方式:一种是“时延”的超时方式,另一种是“绝对”超时方式。第一种方式,

  • 问题内容: 我想知道WebDriver等待超时和隐式等待超时之间的技术差异。 问题答案: 如文档中所述: 在内部设置将用于所有连续搜索的超时。如果找不到该元素,它将尝试在指定的时间内反复查找该元素。它仅执行此操作,不能强制执行其他任何操作- 它等待元素显示。 ,或者只是您用于特定搜索的一次计时器。它具有更大的可扩展性,意味着您可以将其设置为等待可能需要的任何条件。通常,您可以使用一些预构建的元素来