2012-04-13 74 views
5

我已經構建了一個Java自定義消息服務器,它接收消息流並將每條消息傳遞給其客戶端(1:1,如果未連接,則非常簡單,即丟棄消息)。我在Win7x64 & Java 7上運行Tomcat 7,並使用NIO連接器(實現了Comet servlet)。 它工作的很好,但我現在正在研究縮放這頭野獸,目前正在爲每個連接的客戶端分配大約85kb的RAM。 10.000客戶端@ 900MB以下,線性縮放。 (我沒有做其他任何事情,但仍然保持連接)這對我的意見非常重要,所以我想知道是否有一些調整讓Tomcat或Java使用NIO impl保存更多的內存。到目前爲止我嘗試過的所有Tomcat設置都沒有影響到這一點。儘量減少Tomcat「每個連接」的內存佔用量

有沒有人有經驗如何將Java或Tomcat放在有關套接字連接的內存節食上?

更新: 我現在通過修剪套接字緩衝區和一些其他的tomcat內部在70kb /連接下。不知道這如何影響吞吐量。我也在32位/ 64位Linux上嘗試過,結果相同。

+0

您是如何測量每個客戶端85kb的? – dash1e 2012-04-13 07:31:23

+0

我做了一個小負載測試並連接了10.000個客戶端。在服務器代碼中,我在每100個客戶端之後完成一個System.gc(),然後將Runtime.totalMemory() - Runtime.freeMemory()打印到控制檯。 – Daniel 2012-04-13 17:29:24

+0

嗨。你能分享你最好的Tomcat/JVM設置嗎?另外,您是否使用NIO連接器? 10倍 – JRun 2014-05-09 11:30:51

回答

1

經過相當多的研究和玩耍之後,我得出了這樣的結論:Tomcat無法用合理的內存處理大量的併發連接。 (我還是很樂意在這裏順便說一句證明是錯誤的)

然而,有一個救星:

的Netty:http://www.jboss.org/netty/downloads

這是一個Java IO框架,建立在Java的新NIO架構,似乎設計和寫得非常好。您可以將一些輕量級模塊堆疊在一起並創建一個迷你Web服務器,或者簡單地以異步方式自行處理TCP連接。

我在EC2上運行了一次負載測試,並且使它成爲令人振奮的7百萬個連接@只有1.5GB的RAM! (就像tomcat測試一樣,我什麼也沒做,只是存儲連接,所以真正的應用程序當然會消耗更多的mem,但是200字節/連接「開銷」不算什麼!)它只停留在那裏,因爲我限制了Java VM到1.5GB,我確信C10M測試很容易實現。

對Netty和Java VM傢伙的巨大讚譽!我印象深刻。