玻璃鱼线程池问题

10
我们正在使用Glassfish 3.0.1,但遇到了非常长的响应时间;对于我们25%的POST/PUT请求来说,响应时间长达5分钟,在响应返回时,前端负载均衡器已超时。
我认为原因是请求正在排队等待可用线程。我的理论是基于访问日志显示请求完成需要几秒钟,但请求执行时间比预期晚了五分钟。
有没有人可以提供调试线程池问题的建议?或它们的最佳设置是什么?
是否需要定期进行线程转储,还是一次性的就足够了?

2
你的工作线程池大小是多少? - user85155
我们有两个线程池:http-thread-pool和thread-pool-1,后者用于EJB请求,最小大小为5,最大大小为500,我该如何找到工作线程池的大小? - Louis Q
3个回答

6
乍一看,这似乎与线程池本身没有太多关系。在不了解您的网络设置的情况下,以下是我会检查的一些事项:
  • 负载均衡器池中是否有死节点/无响应节点?这可能导致所有请求都尝试针对此节点进行,直到由于超时而在重定向到另一个节点之前失败。
  • 负载均衡器和Glassfish服务器之间的初始连接是否存在问题?这可能是慢速或不正确的DNS查找(虽然服务器应缓存结果),缺少代理或其他网络相关问题。
  • 您是否检查过机器之间的时钟同步?这可能导致日志失去同步。 5分钟是一个非常奇怪的超时时间。

如果所有这些都没有问题,您可能只是负载均衡器和Web服务器之间存在阻抗不匹配,并且您可能需要添加Web服务器来处理负载。 负载均衡器应该能够为您提供有关流量进出以及如何堆叠的大量统计信息。


3
通常情况下,如果您在服务器中配置的工作线程不足,则会出现此行为。通常情况下,常见的Web服务器默认值范围为15到100个线程。但是,如果您的应用程序阻塞了服务器的工作线程(例如等待查询),则默认值通常太低。您可以将工作线程的数量增加到1000个而不会出现问题(确保使用64位)。还要检查任何中间服务器的工作线程数(有时称为“最大并发/打开请求”),例如代理或通过mod_proxy转发的apache。

另一个常见的陷阱是您的软件在阻止传入请求的同时向自身发送请求(例如尝试重新路由或转发请求)。


2

获取线程转储是调试线程池发生了什么的最佳方式。请连续进行3-4次线程转储,每个线程转储之间间隔1-2秒。

从线程转储中,您可以通过线程名称找到工作线程的数量。从多个线程转储中找出长时间运行的线程。

您可以使用TDA工具(http://java.net/projects/tda/downloads/download/tda-bin-2.2.zip)来分析线程转储。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接