我有一个Java Spring应用程序,它将使用Jest客户端查询Elasticsearch(选择不佳,因为文献不多).对于150个并发连接,Elasticsearch的响应时间约为8-20毫秒,但我的应用程序可达到900 -1500毫秒.快速查看VisualVM会告诉我处理器使用率低于10%,对其进行性能分析会告诉我该应用程序执行的所有时间中有98%是等待以下方法
org.apache.http.pool.PoolEntryFuture.await()
这是Apache HttpCore的一部分,也是Jest的依赖项.对于可以在tomcat上运行的线程,我没有任何限制(最大为200,VisualVM表示实验期间的最大线程数为174).因此,它不是在等待空闲线程.
我认为延迟增加过多,并且我怀疑Jest使用的内部线程池没有足够的线程来处理所有请求……但是我不知道.
有什么想法吗?
解决方法:
I think that the latency increase is excessive and I suspect that Jest is using an internal threadpool that has not enough threads to cope with all the requests…
在快速查看源代码时,我看到您应该能够将ClientConfig
注入到Jest客户端工厂中.
ClientConfig具有以下设置方法,这些设置方法似乎会影响内部Apache http客户端连接管理器:
clientConfig.maxTotalConnection(...);
clientConfig.defaultMaxTotalConnectionPerRoute(...);
clientConfig.maxTotalConnectionPerRoute(...);
也许对其中一些进行调整会给您带来更多的联系?看一下JestClientFactory
source,看看它在做什么.在使用HttpClient与同一服务器建立大量连接时,过去肯定要调整这些值.