2012-10-30 41 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

相關問題