2012-10-30 38 views
0

连接我们有一个64位的Linux机器和我们对其他服务而Drools的Guvnor网站(规则引擎,如果你不知道)就是其中之一多个HTTP连接。在Drools中,我们为每个被解雇的规则创建知识库,创建知识库与Guvnor网站建立HTTP连接。JVM上运行了导致到高CPU使用率和OutOfMemoryException异常

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

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

我有几个问题:

  1. 当我们知道我们在过负荷运行?
  2. 内部可以产生多少线程(任何粗略估计或与差异参数有关的公式都可以工作)?
  3. 有没有人见过类似的问题与Drools?同时访问Guvnor网站基本上造成了这个问题。

感谢,

+0

有些人可能不知道/你猜怎么着OOM手段(我想这是内存不足)。请把解释放在某个地方。 – Tudor

+0

我同意,并添加OOM :) – instanceOfObject

回答

1

我查 “执行cat/proc/sys目录/内核/线程-MAX”,它显示27000个 线程,它可以是一个原因?

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

当我们知道我们在过负荷运行?

你有100%的CPU和OOM错误。你的能力超过:)笑话不谈,你应该监视你的HTTP连接队列,以确定你做错了什么。你的文章没有提到你如何处理HTTP连接(大概是通过某种队列支持的池化机制?)。我已经看到容器和程序无限地排队请求,导致它们大爆炸。画出下图来隔离您的问题

  1. 阻塞线程的一段时间采取的每个线程
  2. 时间数
  3. 每线程池中的线程数,以及它们如何随时间而增加/减少(池大小)

多少个线程可以在内部产生了(任何粗略估计或 与差异参数公式将工作)?只有

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

是否有其他人看到与Drools类似的问题?到 的Guvnor网站并发访问基本上是导致该问题的

我不能帮助那里,因为我还没有进入滴料这种方式。抱歉。

2

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

我怀疑包的构建/编译需要时间和肉猪系统。

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

+0

推进这个答案,因为真正的问题是不连接的数量和的Guvnor如何对应。真正的问题似乎是一个特别糟糕的应用程序设计,它会为每个请求加载知识库。 应用程序绝对应该预先装载的知识基础和创造只为每个请求的会话。如果您需要频繁更改规则,那么设计应用程序很容易,可以在运行时从Guvnor软件包中重新加载知识库。 – Steve

相关问题