Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程环境中与Apache HttpClient的HttpPut性能_Java_Multithreading_Performance_Httpclient - Fatal编程技术网

Java 在多线程环境中与Apache HttpClient的HttpPut性能

Java 在多线程环境中与Apache HttpClient的HttpPut性能,java,multithreading,performance,httpclient,Java,Multithreading,Performance,Httpclient,这些天来,我一直在为一个关于ApacheHttpClient和线程的非常奇怪的问题而挣扎 关键是我有一个由所有线程共享的HttpClient,并使用它来执行HttpPut请求以上载一个小文件(8k aprox.)。对于少量线程,一切都正常,时间也很好(200-600毫秒),但是当我们开始增加并发线程的数量时,时间很糟糕(8秒) 我们检查了服务器以确保问题不存在。在相同的负载下使用jmeter(每秒1000个线程),我们得到了毫秒的响应时间 该实现使用线程安全连接管理器: PoolingHttpC

这些天来,我一直在为一个关于ApacheHttpClient和线程的非常奇怪的问题而挣扎

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

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

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

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());
看起来,如果有一个共享资源在高负载时会产生巨大的影响

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


有什么想法吗?

您需要在客户端启用调试,以便执行以下操作:

验证5000个水池是否实际被深度使用。记录器将显示“可用池中保留”的更改总数以及当前使用的池条目的编号

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


您使用的是哪个版本的Apache HttpClient?
  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();