2012-07-08 65 views
1

我開發了一個基於Netty的TCP服務器,以接收基於GSM/GPRS的設備的維護連接並將這些數據保存在MySql數據庫中。目前處理5K連接。設備以30-60秒的間隔發送週期性消息,但連接保持活動狀態以保持雙工通信。爲什麼我的基於Netty的TCP服務器掛起100%的CPU使用率?

服務器應用程序在正常運行時消耗1-2%CPU,峯值高達10%,平均負載非常低。但是,正常運行6小時至48小時後,服務器應用程序會以恆定的100%CPU消耗掛起,線程轉儲表明epoll選擇器是CPU使用率高的原因。應用程序仍然保持連接幾個小時,然後CPU消耗增加到200%,大多數連接被釋放。

在項目開始時,我們使用MINA,並且與1K活動連接有相同的問題,這就是爲什麼我們切換到Netty。直到5K連接Netty更加穩定,掛斷期爲1-2周。

我們的服務器配置:

  • I7-2600四核CPU,
  • 8 GB拉姆,Centos的5.0,
  • 打開JDK 6.0,
  • 的Netty 3.2.4(Netty的是幾小時前更新至3.5.2)

爲了解決這個問題,我們將更新JDK到7.0(JDK有一個針對異步操作進行了優化的新I/O實現),並嘗試包括FreeBSD,Windows Server在內的不同操作系統,因爲每個操作系統都有不同的處理I/O的策略。

任何幫助將不勝感激,謝謝..

+1

我覺得沒有代碼的副本沒有人能夠查明錯誤。 – 2012-07-08 11:58:23

+0

我會嘗試先升級java版本。使用nio時,它的重要性在於擁有最新的java版本。不知道你使用的是什麼版本的openjdk 6. – 2012-07-08 15:48:35

+0

感謝諾曼,我使用OpenJDK「1.6.0_20」,我將更新OpenJDK並分享我的經驗。 – nevzat 2012-07-09 08:02:43

回答

0

這聽起來像Epoll的bug。

該應用正在代理與後端系統的連接。該代理具有可用於向後端系統發送請求的通道池。如果通道中池的數量較少,則會生成新通道並將其放入池中,以便發送到代理的請求可以得到服務。這些池會在應用程序啓動時填充,所以這就是爲什麼CPU不會花費太長時間才能穿過屋頂(進入應用程序生命週期22秒)。 Source

Netty有內置的解決方法。不知道從哪個版本開始,稍後需要更新。

System.setProperty("org.jboss.netty.epollBugWorkaround", "true"); 
相關問題