首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM耗尽连接,导致高CPU利用率和OutOfMemoryException。

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

Stack Overflow用户
提问于 2012-10-30 10:38:54
回答 2查看 1.3K关注 0票数 0

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

所有其他线程都被阻塞,CPU利用率高达100%,从而导致OOM。我们可以在15-20分钟后对规则进行修改。但如果有人已经面对了这个问题,我想确定一下。

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

我有几个问题:

  1. 我们什么时候知道我们的能力过剩了?
  2. 有多少线程可以在内部生成(任何有关差异参数的粗略估计或公式都可以)?
  3. 其他人有没有见过类似的口水问题?同时访问Guvnor网站基本上是造成这个问题的原因。

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-30 11:55:22

我检查了"cat /proc/sys/内核/ 27000 max“,它显示了27000个线程,这是一个原因吗?

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

我们什么时候知道我们的能力过剩了?

您有100%的CPU和OOM错误。除了笑话之外,您还应该监视HTTP连接队列,以确定您做错了什么。您的帖子没有提到您是如何处理HTTP连接的(大概是通过某种由队列支持的池机制?)。我见过容器和程序队列请求无穷无尽地导致它们大爆炸而崩溃。绘制以下图表以隔离您的问题

  1. 随着时间的推移阻塞线程的数量。
  2. 每个线程所需的时间
  3. 每个线程池的线程数及其随时间增加/减少的方式(池大小)

有多少线程可以在内部生成(任何有关差异参数的粗略估计或公式都可以)?

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

其他人有没有见过类似的口水问题?同时访问古弗纳网站基本上是造成这个问题的原因。

因为我没有用这种方式访问drools,所以我在那里无能为力。抱歉的。

票数 1
EN

Stack Overflow用户

发布于 2012-10-30 13:42:36

我的回答是基于这样的假设,即你为每个请求创建了一个知识库,而这个知识库的创建包含了从Guvnor下载最新规则源的过程,如果我弄错了,请更正。

我怀疑构建包的/compilation需要时间并占用您的系统。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13137234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档