2013-04-02 113 views
1

我們在我們的遊戲公司中使用Netty3.2.1進行客戶端和服務器之間的連接管理。我們的目標是提高在blip場景中處理Netty連接

  1. 能夠處理曇花一現場景,如網絡中斷,並必須能夠從這一儘快恢復。
  2. 增加單個服務器可以處理的連接數量,而不必刪除現有的連接套接字。

曇花一現方案 在實時環境中,人們是由於ISP故障光點的機會,所以所有現有客戶(我們的客戶火重新連接後,現有的連接斷開)連接將打破,並在同一重新連接時間 。例如,如果服務器連接到25000個客戶端,則所有25000個客戶端都會在blip期間同時嘗試連接到服務器,這會給服務器帶來巨大的壓力。由於Netty舊版本不提供啓用/禁用功能,所以我們開始將連接限制在超過100個併發連接ssl握手的限制之外。當限制超出限制時,我們暫停老闆線程。我們尚未準備好使用提供該功能的Netty 4.0 Beta版本。

我們在壓力測試期間觀察到的其他情況是,如果服務器上有大量傳入連接,則需要很多時間才能接受所有傳入連接並穩定(25 K連接約30分鐘,全部25 K嘗試同時連接)。但是,如果我們緩慢加載負載,netty能夠在很短的時間內(大約3到5分鐘)輕鬆接受所有連接。我們希望建立這樣一個系統,以便我們能夠靈活地處理blip場景。

  • 我在現有的Netty Jar中添加了一些日誌,當客戶端在巨大負載下斷開連接時,它似乎在read()方法中失敗。
  • 使用Netty3.6最終的jar,沒有多大幫助
  • 將使用執行處理程序的幫助嗎?
  • 禁用限制導致服務器上出現OOM異常。

請提出任何可能的方法來解決此問題。 有沒有其他的方法來節制連接?

設置細節和配置

客戶 - JMeter的框架 - 2個GB機 負載 - 50000個客戶 沒有每秒消息 - 12000個消息/秒。消息以客戶端hello和sever hello作爲字符串。 的ulimit在所有機器上是1,00,000

服務器 - 12核心,HT和48 GB RAM 工作線程 - 50(兩次沒有與核HT它沒有核成爲24) 所有TCP內部linux機器的緩衝區被配置爲使用峯值限制。

我們的管道處理程序有以下處理

  • 管道。addLast(sslHadler) - 構建的處理程序中的Netty
  • pipeline.addLast(messageEncoder) - 只對字節進行編碼和解碼,並根據需要將它們轉換爲消息幀。
  • pipeline.addLast(messageDecoder)
  • pipeline.addLast(Businesshandler)

回答

0

我覺得沒有太多你可以用網狀3.x的在這裏做的,也許旁邊設置的積壓數量少所以客戶端需要稍後重新連接。

所以我認爲你最好的選擇是一旦可能就升級到Netty 4。對不起....

+0

嗨諾曼非常感謝答覆。最後一件事,在這個blip場景中,我們看到現有的套接字也正在關閉。發生這種情況的地方是在Nioworker.java read()方法{if(ret <0 || failure){0,關閉(channel,succeededFuture(channel)); return false;}}請讓我知道爲什麼會出現這種情況。這裏,ret值爲0,決定「ret」值的代碼類似於{while((ret = ch.read(bb))> 0)readBytes + = ret; if(!bb.hasRemaining()){ break;}}}爲什麼會發生這種情況?3.2.1 vers中的任何錯誤? – codeninja