JGroups 增加基于 NIO2 的傳輸控制層
來自 JGroups 開發者消息:JGroups 新增了全新基于 NIO2 的傳輸層 —— TCP_NIO2 !
新的傳輸層完全是非堵塞的,與 TCP 不同的是 Socket 連接、讀寫都不會堵塞。使用 TCP_NIO2 最大的好處就是無需針對每個連接創建一個讀者線程(如果啟用發送隊列還需要創建寫線程)。
在一個有 1000 個節點的集群中,使用 TCP 方法每個節點都要維持 999 個連接和 999 個讀線程。使用 TCP_NIO2 盡管也有 999 個 TCP 連接,但只有一個選擇器線程用來服務所有連接。當數據可讀取,我們可以無堵塞的讀取盡可能多的數據,并將讀取到的數據傳遞個相應方法處理。
也就是說相對于 TCP 而言,TCP_NIO2 更具備可伸縮性。
性能
我們在一個 9 個節點(每個節點有8核處理器和千兆網絡)的集群中運行 UPerf 和 MPerf 測試,得到如下結果:
UPerf (500'000 請求/節點, 50 invoker 線程/節點):
TCP: 62'858 reqs/sec/node, TCP_NIO2: 65'387 reqs/sec/node
MPerf (1百萬消息/節點, 50 個發送線程/節點):
TCP: 69'799 msgs/sec/node, TCP_NIO2: 77'126 msgs/sec/node
可見 TCP_NIO2 在兩種情況下運行都更好,我對這個結果也非常驚訝,BIO 方法更快。
我建議你在自己的環境中也進行測試看看。
相關鏈接:
[1] http://www.jgroups.org/manual/index.html#TCP_NIO2
[2] https://github.com/belaban/JGroups/blob/master/src/org/jgroups/protocols/TCP_NIO2.java
[3] http://www.jgroups.org/manual/index.html#PerformanceTests