netty 配置說明

SO_RCVBUF

適用於TCP和UDP socket接收緩衝區,該值會影響應用程序的吞吐量算法

  • UDP協議的話,對丟包有很大的幫助,不過設置過大,也會雪崩,程序處理不過來,多大的rcvbuf都不夠用
  • SO_RCVBUF的大小受制於操做系統的限制,這個很容易理解,就是操做系統 要做爲保護系統的最後一道屏障,得有一個閥值來控制極其不合理的設置,具體查看Linux內核參數net.core.rmem_max和net.core.wmem_default.例如:若是咱們設置的 SO_RCVBUF大於net.core.rmem_max,就會取net.core.rmem_max爲最終結果
SO_SNDBUF

適用於TCP和UDP socket發送緩衝區,該值會影響應用程序的吞吐量網絡

  • 具體細節能夠參考SO_RCVBUF的說明,他們兩個一個接收,一個發送,注意點都是相同的,Linux內核參數配置爲net.core.wmem_max和net.core.wmem_default

TCP_NODELAY

適用於TCPsocket

  • TCP_NODELAY=TRUE 則禁用Nagle算法
  • Nagle算法是以減小數據包發送量來增進TCP/IP網絡的性能

RCVBUF_ALLOCATOR

適用於TCP,UDP, netty從socket緩衝區每次讀取收據的大小,受制於該配置性能

  • 實現類有FixedRecvByteBufAllocator和AdaptiveRecvByteBufAllocator,儘可能使用AdaptiveRecvByteBufAllocator,由於AdaptiveRecvByteBufAllocator做爲自適應接收緩衝區內存分配的實現,能夠根據上次接收到的數據大小,來本身調整下次應該分配的空間,這樣能夠節省內存,特別是鏈接比較多的應用
  • 對於UDP,若是RCVBUF_ALLOCATOR的緩衝區大小,小於發送端消息的大小,就會形成消息被截斷,因此該配置的大小要合理設置
  • DefaultMaxMessagesRecvByteBufAllocator.maxMessagesPerRead
    • netty每次收到socket read通知,讀取maxMessagesPerRead條數據(最多,沒有足夠的則返回),具體查看邏輯io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator.MaxMessageHandle#continueReading(io.netty.util.UncheckedBooleanSupplier)
    • 默認狀況下,socket通知應用程序緩衝區有新數據,應用程序就會去讀取一條,循環往復,netty內部能夠設置maxMessagesPerRead,來一次性讀取多條數據,來提升必定的性能,默認maxMessagesPerRead=0,也就是讀取一次
    • 設置maxMessagesPerRead時要注意,若是你使用的是AdaptiveRecvByteBufAllocator,那麼udp下,有多是存在消息被截取的狀況,後邊說明該狀況
    • 建議:最好不要去設置該參數,除非你很瞭解netty
  • DefaultMaxMessagesRecvByteBufAllocator.respectMaybeMoreData
    • 該配置是配合maxMessagesPerRead來使用的,也就是隻有maxMessagesPerRead>1的狀況下,respectMaybeMoreData才起到做用
    • 這是爲了防止,一次socket通知讀取多條數據時,第一天之後數據被截取(由於第二條之後的數據讀取大小,是以讀取第一條數據時分配的大小爲準的,固然FixedRecvByteBufAllocator是不受影響的,由於FixedRecvByteBufAllocator每次分配的大小是固定的)
    • 下邊是復現一個有問題的案例
      • recvByteBufAllocator = new AdaptiveRecvByteBufAllocator(256, 500, 2048);//第一次會分配512字節的內存
      • recvByteBufAllocator.maxMessagesPerRead(3);//一次性嘗試讀取3條數據
      • recvByteBufAllocator.respectMaybeMoreData(false);//不關注後續消息可能會更大(相比第一條)
      • udpClient.send(200);udpClient.send(>512 bytes);//第一次發送200字節,第二次發送大於512字節
      • 其中,第二條數據收到的是512字節,而不是實際字節大小,具體可查看io.netty.channel.nio.AbstractNioMessageChannel.NioMessageUnsafe#read方法裏面讀取的邏輯

SO_KEEPALIVE

SO_TIMEOUT

相關文章
相關標籤/搜索