Netty——參數說明


 

Netty參數

ALLOCATOR

Netty參數ByteBuf的分配器 ByteBufAllocator,對象池化。可選值(Netty4.x):ByteBufAllocator.DEFAULTPooledByteBufAllocator.DEFAULTUnpooledByteBufAllocator.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的大小超過高水位線的時候對應channelisWritable就會變成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時,觸發ChannelInboundHandleruserEventTriggered()方法,事件為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_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT設置keepalive的開始時間、間隔、次數等參數。

當然,也可以通過設置/proc/sys/net/ipv4/tcp_keepalive_timetcp_keepalive_intvltcp_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,表示禁用該功能。

 

 

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM