netty高效能原因,netty調優
阿新 • • 發佈:2019-01-04
從大的方面看,netty效能高效主要體現在:
1.io執行緒模型
使用reactor模式,同步非阻塞。這決定了可以用最少的資源做更多的事。
2.記憶體零拷貝
使用直接快取
3.記憶體池設計
申請的記憶體可以重用,主要指直接記憶體。
內部實現是用一顆二叉查詢樹管理記憶體分配情況。
4.串形化處理socket讀寫,避免鎖,即一個指定socket的訊息是串形化處理的。這樣效能比多個執行緒同時 處理一個socket對應訊息要好,因為多執行緒處理會有鎖。
5.提供對protobuf等高效能序列化協議支援
應用netty調優:
1.若只希望該handler處理完後,交給下一個handler處理,則呼叫:
ChannelHandlerContext的fireRead之類的方法。
直接通過channel.read或write則會觸發完整的handler處理鏈。
2.SimpleChannelInboundHandler讀取完並且全部handler處理完後,會自動釋放訊息。
ChannelInboundHandlerAdapter不會自動釋放訊息。
3.ServerSocketChannel一次loop預設最多處理16次客戶端連線,這個主要是因為服務端會對應很多客戶端,保證較高的吞吐量。
對應引數:MAX_MESSAGES_PER_READ
4.WRITE_BUFFER_LOW_WATER_MARK可用於做流控
需要應用呼叫isWritable方法,如果返回false暫時寫失敗。
5.直接記憶體使用,零拷貝。直接記憶體塊快取池設計。
6.避免多執行緒在從記憶體塊快取池中獲取記憶體塊發生阻塞競爭,小塊記憶體大小從執行緒獨有的cache中獲取。
7.reactor模式核心是用最少的資源處理最多的事情,一個reactor執行緒負責檢視註冊的關心事件
8.軟中斷
linux 2.6.35以上版本可以設定rps,主要目的是將資料包的處理均勻打散在每個cpu上。提升網路處理能力。
9.設定tcp引數
主要是接收快取區大小:SO_RCVBUF,及傳送快取區大小:SO_SNDBUF。
關閉SO_TCPNODELAY,對於要求延遲小的應用。