Apache HttpClient PoolingHttpClientConnectionManager 连接泄漏?
我使用客户 Apache Http 在申请中 Scala.
该应用程序具有具有高平行度的相当高的带宽。
我不确定,但我认为也许,我有一个连接泄漏。 似乎只要使用使用客户端占用的代码的代码,应用程序就会停止响应。 我怀疑是我跳过套接字或其他东西,然后导致申请停止工作的其他方面的事实。 连接的泄漏也可能没有足够的快速关闭。
对于更大的上下文,一些动作有时会导致该代码并行地执行数百分钟。 当这件事发生时, Rest API /喷/ 应用程序停止反应。 还有其他应用领域也在高行性中工作,并且他们从不造成应用响应性的问题。
显然,这段代码部分的并行性的减少促进了问题,但不是一种可行的长期解决方案。
我忘了配置某些东西或不正确设置?
我使用的代码看起来像这样:
EDIT
我看到我在状态中创建了很多连接 TIME_WAIT. 我试图配置 DefaultMaxPerRoute 和 MaxTotal 在不同的值上没有明显的效果。 看来我想念一些东西,结果,连接不被重用,但我找不到任何提出我想念的文件的文件。 这些连接重复使用非常重要。
EDIT 2
通过进一步研究使用 lsof-p, 如果我设置了,我明白了 MaxPerRoute 在 10, 实际上 10 连接将列为 "ESTABLISHED". 我看到端口号不会改变。 在我看来,它意味着它实际上它重新起作用。
什么都没有解释它,所以这就是为什么我仍然错过了这个代码中的连接? 重复使用的化合物和泄漏的化合物 /找到了帮助 netstat-a/, 显示在一个状态 TIME_WAIT, 有相同的基础 url. 所以它们肯定连接。 我是否有可能重新使用连接,但随后不知何故,关闭答案?
EDIT 3
位于Source B. TIME_WAIT, 前 "leak". 它在一个未绑定的代码部分。 所以它没有关系 HttpClient. 但是,修复此代码后,一切 TIME_WAITs 消失了,但申请仍然不再反应反复按下代码 HttpClient. 还在探索这一部分。
该应用程序具有具有高平行度的相当高的带宽。
我不确定,但我认为也许,我有一个连接泄漏。 似乎只要使用使用客户端占用的代码的代码,应用程序就会停止响应。 我怀疑是我跳过套接字或其他东西,然后导致申请停止工作的其他方面的事实。 连接的泄漏也可能没有足够的快速关闭。
对于更大的上下文,一些动作有时会导致该代码并行地执行数百分钟。 当这件事发生时, Rest API /喷/ 应用程序停止反应。 还有其他应用领域也在高行性中工作,并且他们从不造成应用响应性的问题。
显然,这段代码部分的并行性的减少促进了问题,但不是一种可行的长期解决方案。
我忘了配置某些东西或不正确设置?
我使用的代码看起来像这样:
class SomeClass {
val connectionManager = new PoolingHttpClientConnectionManager//
connectionManager.setDefaultMaxPerRoute/50/
connectionManager.setMaxTotal/500/
val httpClient = HttpClients.custom//.setConnectionManager/connectionManager/.build//
def postData// {
val post = new HttpPost/"[url=http://SomeUrl"/]http://SomeUrl"/[/url] // Typically this URL is fixed. It doesn't vary much if at all.
post.setEntity/new StringEntity/"Some Data"//
try {
val response = httpClient.execute/post/
try {
// Check the response
} finally {
response.close//
}
} finally {
post.releaseConnection//
}
}
}
EDIT
我看到我在状态中创建了很多连接 TIME_WAIT. 我试图配置 DefaultMaxPerRoute 和 MaxTotal 在不同的值上没有明显的效果。 看来我想念一些东西,结果,连接不被重用,但我找不到任何提出我想念的文件的文件。 这些连接重复使用非常重要。
EDIT 2
通过进一步研究使用 lsof-p, 如果我设置了,我明白了 MaxPerRoute 在 10, 实际上 10 连接将列为 "ESTABLISHED". 我看到端口号不会改变。 在我看来,它意味着它实际上它重新起作用。
什么都没有解释它,所以这就是为什么我仍然错过了这个代码中的连接? 重复使用的化合物和泄漏的化合物 /找到了帮助 netstat-a/, 显示在一个状态 TIME_WAIT, 有相同的基础 url. 所以它们肯定连接。 我是否有可能重新使用连接,但随后不知何故,关闭答案?
EDIT 3
位于Source B. TIME_WAIT, 前 "leak". 它在一个未绑定的代码部分。 所以它没有关系 HttpClient. 但是,修复此代码后,一切 TIME_WAITs 消失了,但申请仍然不再反应反复按下代码 HttpClient. 还在探索这一部分。
没有找到相关结果
已邀请:
2 个回复
知食
赞同来自:
对于泄漏,应该相对容易地追踪,运行具有控制化合物的上下文测井的应用程序,如上所述
http://hc.apache.org/httpcompo ... .html
奔跑吧少年
赞同来自:
我不 scala 人 / android, java/, 但我在客户端做了很多和很多优化 http threadpools. 域连接的IMO盲目增加 50 掩盖一些其他严重的问题 thruput.
2 观点:
如果你使用常见 "sharedPoolingClientConnManager", 正确转到域的一个小池,并符合推荐的方式来释放您的 conn 回到游泳池 / 您必须能够通过查看实例的连接状态的工作度量来调试所有此操作 threadpool/, 那 u 一定是好的。
无论并行性的功能如何 scala, 你必须了解如何 5 来自域中的池中的相应流共享套接字?? IMO 从经验 android/java 因此,即使每个流性表演者都是作为该操作员的一部分向服务器的阻塞输入压力。 httpclient.exec, 实际的频道管理允许您使用非常高 thruput, 不用诉诸客户库 ASNyC 为了 http.
Android 由于客户只有,经验可能不相关 4 洪水。 说它即使你有 64 或者更多的可访问流,我只是不明白您需要的内容 10 域连接到基站套接字 http 非常非常忙碌 thruput.