Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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池连接优化_Java_Multithreading_Apache_Http - Fatal编程技术网

Java池连接优化

Java池连接优化,java,multithreading,apache,http,Java,Multithreading,Apache,Http,在Java中,配置http连接池以支持对同一服务器的大量并发http调用的commons指南/建议有哪些?我的意思是: 最大总连接数 每个路由的最大默认连接数 重用策略 生存策略 持续时间 连接超时 (我正在使用ApacheHTTP组件4.3,但我可以探索新的解决方案) 为了更清楚,我的情况如下: 我开发了一个REST资源,它需要对AWS CloudSearch执行大约10个http调用,以获得要在最终结果中收集的搜索结果(我确实无法通过单个查询获得)。 整个操作所需时间必须少于0.25秒

在Java中,配置http连接池以支持对同一服务器的大量并发http调用的commons指南/建议有哪些?我的意思是:

  • 最大总连接数
  • 每个路由的最大默认连接数
  • 重用策略
  • 生存策略
  • 持续时间
  • 连接超时
(我正在使用ApacheHTTP组件4.3,但我可以探索新的解决方案)

为了更清楚,我的情况如下:

我开发了一个REST资源,它需要对AWS CloudSearch执行大约10个http调用,以获得要在最终结果中收集的搜索结果(我确实无法通过单个查询获得)。 整个操作所需时间必须少于0.25秒。因此,我在10个不同的线程中并行运行http调用。 在一次钳工测试中,我注意到,在几乎没有并发请求的情况下,5,我的目标实现了。但是,如果将并发请求增加到30个,则由于连接时间大约需要1秒,因此性能会大大降低。相反,如果并发请求很少,连接时间约为150毫秒(更准确地说,第一次连接需要1秒,以下所有连接都需要150毫秒)。我可以确保CloudSearch在不到15毫秒的时间内返回其响应,因此我的连接池中存在问题


谢谢大家!

最适合您的实现的线程/连接数量取决于该实现(您没有发布),但以下是一些需要的指导原则:

  • 如果这些线程根本不阻塞,那么您应该拥有与内核一样多的线程(Runtime.availableCores(),这将包括超线程内核)。仅仅因为不可能100%以上的CPU使用率

  • 如果线程很少阻塞,cores*2是基准测试的良好开端

  • 如果线程经常阻塞,则绝对需要使用各种设置对应用程序进行基准测试,以找到适合您的实现、操作系统和硬件的最佳解决方案

现在,最理想的情况显然是第一种情况,但要实现这一种情况,您需要尽可能地从代码中删除阻塞。如果在非阻塞模式下使用NIO包,Java可以为IO操作执行此操作(Apache包不是这样做的)

然后有一个线程等待选择器,并在任何数据准备好发送或读取时立即唤醒。然后,该线程仅将数据从源复制到目标并返回选择器。在读取(传入数据)的情况下,该目的地是一个阻塞队列,核心线程在该队列上等待。其中一个线程将取出接收到的数据并处理它,现在没有任何阻塞

然后,您可以使用阻塞队列的长度来调整任务和硬件合理的并行请求数


第一次连接需要>1秒,因为它实际上必须通过DNS查找地址。所有其他连接暂时处于暂停状态,因为这样做两次没有意义。您可以通过调用IP(如果您与负载平衡器交谈,可能不太好)或通过使用初始请求“预热”连接来避免这种情况。之后的任何新连接都将使用缓存的DNS结果,但仍需要执行其他初始化,因此尽可能多地重用连接将大大减少延迟。对于NIO,这是一项非常简单的任务

此外还有,也就是说:您建立一个连接,但在一个请求中请求多个URL,并通过“同一行”得到多个响应。这大大减少了连接开销,但需要服务器支持