【发布时间】: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