JVM耗尽连接导致高CPU利用率和OutOfMemoryException

时间:2012-10-30 10:38:55

标签: java multithreading drools drools-guvnor

我们有一台64位的linux机器,我们与其他服务建立了多个HTTP连接,而Drools Guvnor网站(规则引擎,如果您不知道)就是其中之一。在drools中,我们根据被触发的规则创建知识库,并且创建知识库与Guvnor网站建立HTTP连接。

所有其他线程都被阻止,CPU利用率上升到~100%,导致OOM。我们可以在15-20分钟后进行更改以编译规则。但是如果有人已经面对这个问题,我想确定问题。

我检查了"cat /proc/sys/kernel/threads-max"并显示了27000个帖子,这可能是个原因吗?

我有几个问题:

  1. 我们什么时候知道我们的容量已超过容量?
  2. 内部可以生成多少个线程(任何粗略估计或与diff参数相关的公式都可以使用)?
  3. 还有其他人与Drools见过类似的问题吗?同时访问Guvnor网站基本上导致了这个问题。
  4. 谢谢,

2 个答案:

答案 0 :(得分:2)

我的答案基于您为每个请求创建知识库的假设,并且此知识库创建包含从Guvnor下载最新规则源,如果我弄错了请更正。

我怀疑包的构建/编译花费时间并占用你的系统。

您可以从guvnor下载预构建包,而不是在每个请求上编译包,如果规则没有太大变化,您也可以在本地缓存这些包。唯一的限制是你需要在guvnor和你的应用程序中使用相同版本的drools。

答案 1 :(得分:1)

  

我检查了“cat / proc / sys / kernel / threads-max”,它显示了27000   线程,这可能是一个原因吗?

这个数字确实看起来很大,但我们不知道这些线程中的大多数是否属于你的java应用程序。创建一个java线程转储来确认这一点。您的线程转储还将显示每个线程占用的CPU时间。

  

我们什么时候才知道我们的容量超过容量?

您有100%的CPU和OOM错误。你的容量超过了:)除了笑话,你应该监视你的HTTP连接队列,以确定你做错了什么。您的帖子没有说明您如何处理HTTP连接(可能是通过队列支持的某种池化机制?)。我已经看到容器和程序无限地排队请求导致它们以大爆炸的速度崩溃。绘制以下图表以隔离您的问题

  1. 一段时间内阻塞线程的数量
  2. 每个帖子花费的时间
  3. 每个线程池的线程数以及它们随时间增加/减少的方式(池大小)
  4.   

    可以在内部生成多少个线程(任何粗略估计或   关于差异参数的公式会起作用吗?

    只有负载测试才能回答这个问题。加载您的服务器并确定它可以支持的并发用户数为60-70%。注意此时内部生成的线程数。这是您的峰值容量(允许意外流量的空间)

      

    还有其他人与Drools有过类似的问题吗?并发访问   Guvnor网站基本上导致了问题

    我无法帮助那里,因为我没有以这种方式访问​​drools。遗憾。