【问题标题】:HttpPut peformance with Apache HttpClient in a multithread environment多线程环境中 Apache HttpClient 的 HttpPut 性能
【发布时间】:2014-08-10 06:00:26
【问题描述】:

这些天来,我正在努力解决一个关于 Apache HttpClient 和线程的非常奇怪的问题。

关键是我有一个由所有线程共享的 HttpClient,并使用它来执行 HttpPut 请求以上传一个小文件(大约 8k)。好吧,使用少量线程一切都很好,时间也很好(200-600 毫秒),但是当我们开始增加并发线程的数量时,时间很糟糕(8 秒)。

我们检查了服务器以确保问题不存在。使用具有相同负载(每秒 1000 个线程)的 jmeter,我们得到了毫秒级的响应时间!!

实现使用线程安全的连接管理器:

PoolingHttpClientConnectionManager httpConnectionManager = new PoolingHttpClientConnectionManager();
httpConnectionManager.setMaxTotal(5000);
httpConnectionManager.setDefaultMaxPerRoute(5000);

HttpClient httpClient = HttpClientBuilder.create()
     .setConnectionManager(httpConnectionManager)
     .build();

线程运行以下代码:

HttpPut put = new HttpPut(urlStr);
put.setConfig(RequestConfig.custom()
     .setExpectContinueEnabled(true)
     .setStaleConnectionCheckEnabled(false)
     .setRedirectsEnabled(true).build());
put.setEntity(new FileEntity(new
            File("image.tif")));
put.setHeader("Content-Type", "image/tiff");
put.setHeader("Connection", "keep-alive");

HttpResponse response = httpClient.execute(put, HttpClientContext.create());

看起来如果有一个共享资源在高负载时会产生巨大的影响。

查看 Apache Jmeter 的源代码,我没有看到与此代码相关的差异。

有什么想法吗?

【问题讨论】:

  • 您使用的是哪个版本的 Apache HttpClient?

标签: java multithreading performance httpclient


【解决方案1】:

您需要在客户端打开调试才能执行以下操作:

验证 5000 池实际上已被深度使用。记录器将显示“可用剩余池”的变化总数以及当前正在使用的池条目数。

确认您已立即清理并返回以合并条目。记得关闭你的资源(用于访问响应的流、实体对象)

  CloseableHttpResponse response
    case PUT:
        HttpPut httpPut = new HttpPut(url);
        httpPut.setProtocolVersion(new ProtocolVersion("HTTP", 1,1));
        httpPut.setConfig(this.config);
        httpPut.setEntity(new StringEntity(data, ContentType.APPLICATION_JSON));                
        response = httpClient.execute(httpPut, context);
        httpPut.releaseConnection();

More info

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2016-03-24
    • 1970-01-01
    • 2016-06-26
    • 2019-05-08
    • 2018-05-10
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多