我們在我們的遊戲公司中使用Netty3.2.1進行客戶端和服務器之間的連接管理。我們的目標是提高在blip場景中處理Netty連接
- 能夠處理曇花一現場景,如網絡中斷,並必須能夠從這一儘快恢復。
- 增加單個服務器可以處理的連接數量,而不必刪除現有的連接套接字。
曇花一現方案 在實時環境中,人們是由於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)
嗨諾曼非常感謝答覆。最後一件事,在這個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