Netty參數
ALLOCATOR
Netty參數。ByteBuf的分配器 ByteBufAllocator,對象池化。可選值(Netty4.x):ByteBufAllocator.DEFAULT、PooledByteBufAllocator.DEFAULT、UnpooledByteBufAllocator.DEFAULT
默認值(Netty4.1):
- 非
Android:PooledByteBufAllocator.DEFAULT Android:UnpooledByteBufAllocator.DEFAULT
代碼設置:
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
系統參數配置:
io.netty.allocator.type,使用字符串值:unpooled,pooled
說明:
Netty的ByteBuf使用的是 堆外的池化模式。
RCVBUF_ALLOCATOR
Netty參數。用於Channel分配接受Buffer的分配器,默認值為 AdaptiveRecvByteBufAllocator.DEFAULT,是一個自適應的接受緩沖區分配器,能根據接受到的數據自動調節大小。
可選值為 FixedRecvByteBufAllocator,固定大小的接受緩沖區分配器。
默認值:
默認值為 AdaptiveRecvByteBufAllocator.DEFAULT。
代碼設置:
bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT);
或者
bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(592048)) //配置固定長度接收緩存區分配器
WRITE_BUFFER_WATER_MARK
Netty參數。水位線,提用戶當前通道的消息堆積情況。用於替代原有的高低水位線參數,高水位線和低水位線是字節數。
值類型:io.netty.channel.WriteBufferWaterMark,包含 WRITE_BUFFER_HIGHT_WATER_MARK(高水位線)和 WRITE_BUFFER_LOW_WATER_MARK(低水位線)兩個默認屬性,並提供帶入參的構造方法來設置高低水位線。
當buffer的大小超過高水位線的時候對應channel的isWritable就會變成false,當buffer的大小低於低水位線的時候,isWritable就會變成true。
所以每次調用channl.write(...)方法應該判斷isWritable,如果是false就不要再寫數據了。
說明:
上面提到的buffer,是 ChannelOutboundBuffer,是Netty等待寫入系統內核緩沖區的消息隊列。ChannelOutboundBuffer本身是無界的,所以用的時候要注意。
默認值:
默認高水位是64K,低水位是32K,可以根據應用需要支持多少連接數和系統資源進行合理規划。
代碼設置:
bootstrap.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1 * 1024 * 1024, 3 * 1024 * 1024))
CONNECT_TIMEOUT_MILLIS
Netty參數。連接超時毫秒數。
默認值:
默認值30000毫秒,即30秒。
代碼設置:
bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60000)
WRITE_SPIN_COUNT
Netty參數。一個Loop寫操作執行的最大次數。默認值為16,也就是說,對於大數據量的寫操作至多進行16次,如果16次仍沒有全部寫完數據,此時會提交一個新的寫任務給EventLoop,任務將在下次調度繼續執行。
這樣,其他的寫請求才能被響應不會因為單個大數據量寫請求而耽誤。
默認值:
默認值為16。
MAX_MESSAGES_PER_READ
Netty參數。一次Loop讀取的最大消息數。
默認值:
對於ServerChannel或者NioByteChannel,默認值為16,其余Channel默認值為1。默認值這樣設置是由於:ServerChannel須要接受足夠多的鏈接,保證大吞吐量,NioByteChannel能夠減小沒必要要的系統調用select。
ALLOW_HALF_CLOSURE
Netty參數。一個連接的遠端關閉時本地端是否關閉。
值為False時,連接自動關閉;為True時,觸發ChannelInboundHandler的userEventTriggered()方法,事件為ChannelInputShutdownEvent。
默認值:
默認值為False。
Socket參數
TCP_NODELAY
TCP參數 。用於啟用或關閉Nagle算法。立即發送數據 。
在TCP/IP協議中,無論發送多少數據,總是要在數據前面加上協議頭,同時,對方接收到數據,也需要發送ACK表示確認。為了盡可能的利用網絡帶寬,TCP總是希望盡可能的發送足夠大的數據。
這里就涉及到一個名為Nagle的算法,該算法的目的就是為了盡可能發送大塊數據,避免網絡中充斥着許多小數據塊。
如果要求高實時性,有數據發送時就馬上發送,就將該選項設置為true關閉Nagle算法;如果要減少發送次數減少網絡交互,就設置為false等累積一定大小后再發送。
默認值:
默認值為true(Netty默認為true,而操作系統默認為false)
代碼設置:
bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
SO_SNDBUF
Socket參數。SO_SNDBUF是操作系統內核的寫緩沖區,所有應用程序需要發送到對端的信息,都會放到該緩沖區中,等待發往對端。
默認值(16K):
[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4194304 #第一個表示最小值,第二個表示默認值,第三個表示最大值
SO_RECBUF
Socket參數。SO_RECBUF是操作系統內核的讀緩沖區,所有對端發過來的數據都會放到該緩沖區中,等待應用程序取走。
默認值(86K):
[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4194304 #第一個表示最小值,第二個表示默認值,第三個表示最大值
SO_BACKLOG
Socket參數。用於構造服務端套接字ServerSocket對象,標識當服務器請求處理線程全滿時,用於臨時存放已完成三次握手的請求的隊列(accept 全連接隊列)的最大長度。
若是隊列已滿,客戶端鏈接將被拒絕。
默認值:
windows為200,其余為128。
代碼設置:
bootstrap.option(ChannelOption.SO_BACKLOG, 1024)
SO_TIMEOUT
Socket參數。超時時間。
代碼設置:
SO_KEEPALIVE
Socket參數。是否啟用心跳保活機制,即連接保活。 啟用該功能時,TCP會主動探測空閑連接的有效性。
在雙方TCP套接字建立連接后(即都進入ESTABLISHED狀態)並且在兩個小時左右(默認的心跳間隔是7200s即2小時)上層沒有任何數據傳輸的情況下,這套機制才會被激活。
默認值:
Netty默認關閉該功能,即值為:false 。
代碼設置:
bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
說明:
如果一方已經關閉或異常終止連接,而另一方卻不知道,我們將這樣的TCP連接稱為半打開的。TCP通過保活定時器(KeepAlive)來檢測半打開連接。
在高並發的網絡服務器中,經常會出現漏掉socket的情況,對應的結果有一種情況就是出現大量的CLOSE_WAIT狀態的連接。這個時候,可以通過設置KEEPALIVE選項來解決這個問題。
設置SO_KEEPALIVE選項來開啟KEEPALIVE,然后通過TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT設置keepalive的開始時間、間隔、次數等參數。
當然,也可以通過設置/proc/sys/net/ipv4/tcp_keepalive_time、tcp_keepalive_intvl和tcp_keepalive_probes等內核參數來達到目的,但是這樣的話,會影響所有的socket。
SO_REUSEADDR
Socket參數。地址復用,默認值false。有四種情況可以使用:
- 允許啟動一個監聽服務器並捆綁其端口,即使以前建立的將此端口用做他們的本地端口的連接仍存在。這通常是重啟監聽服務器時出現,若不設置此選項,則bind時將出錯。
- 允許在同一端口上啟動同一服務器的多個實例,只要每個實例捆綁一個不同的本地IP地址即可。使用在有多塊網卡或使用類似
IP Alias技術的機器。 - 允許單個進程捆綁同一端口到多個socket上,只要每個捆綁指定不同的本地IP地址即可。這一般不用於TCP服務器。
- 允許完全重復的捆綁:當一個IP地址和端口綁定到某個套接口上時,還允許此IP地址和端口捆綁到另一個套接口上。一般來說,這個特性僅在支持多播的系統上才有,而且只對UDP套接口而言(TCP不支持多播)
SO_LINGER
Socket參數。關閉Socket的延遲時間。值含義如下:
-1:表示socket.close()方法立即返回,但OS底層會將發送緩沖區的數據全部發送到對端。0:表示socket.close()方法立即返回,OS放棄發送緩沖區的數據直接向對端發送RST包,對端收到復位錯誤。非0整數值:表示調用socket.close()方法的線程被阻塞直到延遲時間到或發送緩沖區中的數據發送完畢,若超時,則對端會收到復位錯誤。
默認值:
默認值為-1,表示禁用該功能。
參考:
