使用Jest的服务在线程池上是阻塞的,为什么?

时间:2013-10-22 16:23:39

标签: java multithreading concurrency threadpool jest

我有一个Java + Spring应用程序,它将使用Jest客户端查询Elasticsearch(糟糕的选择,因为它的文档很少)。 Elasticsearch的响应时间约为8-20毫秒,150个并发连接,但我的应用程序上升到900-1500毫秒。快速浏览VisualVM告诉我,处理器使用率低于10%,并且分析它告诉我应用程序执行的98%的时间都在等待以下方法

org.apache.http.pool.PoolEntryFuture.await()

是Apache HttpCore的一部分,也是Jest的依赖项。我对可以在tomcat上运行的线程没有限制(最大值为200,而VisualVM表示实验期间最大线程数为174)。所以它不是在等待免费线程。

我认为延迟增加过多,我怀疑Jest使用的内部线程池没有足够的线程来处理所有请求......但我不知道。

思想?

2 个答案:

答案 0 :(得分:4)

  

我认为延迟增加过多,我怀疑Jest使用的内部线程池没有足够的线程来处理所有请求......

在快速浏览源代码时,我发现你应该能够将ClientConfig注入Jest客户端工厂。

ClientConfig具有以下设置器,它们似乎会影响内部Apache http客户端连接管理器:

clientConfig.maxTotalConnection(...);
clientConfig.defaultMaxTotalConnectionPerRoute(...);
clientConfig.maxTotalConnectionPerRoute(...);

也许调整一些会给你更多的联系?看看JestClientFactory source,看看它在做什么。在使用HttpClient与同一服务器建立大量连接时,我们必须在过去调整这些值。

答案 1 :(得分:0)

我只用一个连接来测试它,看看平均响应时间是多少。只有一个线程,您应该拥有足够的线程和资源等。很可能该进程正在等待外部资源,如数据库或网络服务。