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