一、ChannelOption
ChannelOption.SO_BACKLOG 對應的是tcp/ip協議listen函數中的backlog參數,函數listen(int socketfd,int backlog)用來初始化服務端可連接隊列 服務端處理客戶端連接請求是順序處理的,所以同一時間只能處理一個客戶端連接,多個客戶端來的時候, 服務端將不能處理的客戶端連接請求放在隊列中等待處理,backlog參數指定了隊列的大小
ChannelOption.SO_REUSEADDR 對應於套接字選項中的SO_REUSEADDR,這個參數表示允許重復使用本地地址和端口, 比如,某個服務器進程占用了TCP的80端口進行監聽,此時再次監聽該端口就會返回錯誤,使用該參數就可以解決問題, 該參數允許共用該端口,這個在服務器程序中比較常使用,
Channeloption.SO_KEEPALIVE參數對應於套接字選項中的SO_KEEPALIVE,該參數用於設置TCP連接,當設置該選項以后,連接會測試鏈接的狀態, 這個選項用於可能長時間沒有數據交流的連接。當設置該選項以后,如果在兩小時內沒有數據的通信時,TCP會自動發送一個活動探測數據報文。
ChannelOption.SO_SNDBUF(發送緩沖區)和ChannelOption.SO_RCVBUF(接受緩沖區) 參數對應於套接字選項中的SO_SNDBUF,參數對應於套接字選項中的SO_RCVBUF這兩個參數用於操作接收緩沖區和發送緩沖區的大小, 接收緩沖區用於保存網絡協議站內收到的數據,直到應用程序讀取成功,發送緩沖區用於保存發送數據,直到發送成功。
- FixedRecvByteBufAllocator:固定長度的接收緩沖區分配器,由它分配的 ByteBuf 長度都是固定大小的,並不會根據實際數據報的大小動態收縮。但是,如果容量不足,支持動態擴展。動態擴展是 Netty ByteBuf 的一項基本功能,與 ByteBuf 分配器的實現沒有關系;
- AdaptiveRecvByteBufAllocator:容量動態調整的接收緩沖區分配器,它會根據之前 Channel 接收到的數據報大小進行計算,如果連續填充滿接收緩沖區的可寫空間,則動態擴展容量。如果連續 2 次接收到的數據報都小於指定值,則收縮當前的容量,以節約內存。
ChannelOption.SO_LINGER 參數對應於套接字選項中的SO_LINGER,Linux內核默認的處理方式是當用戶調用close()方法的時候,函數返回,在可能的情況下, 盡量發送數據,不一定保證會發送剩余的數據,造成了數據的不確定性,使用SO_LINGER可以阻塞close()的調用時間,直到數據完全發送
ChannelOption.TCP_NODELAY 參數對應於套接字選項中的TCP_NODELAY,該參數的使用與Nagle算法有關Nagle算法是將小的數據包組裝為更大的幀然后進行發送, 而不是輸入一次發送一次,因此在數據包不足的時候會等待其他數據的到了,組裝成大的數據包進行發送,雖然該方式有效提高網絡的有效負載, 但是卻造成了延時,而該參數的作用就是禁止使用Nagle算法,使用於小數據即時傳輸,於TCP_NODELAY相對應的是TCP_CORK, 該選項是需要等到發送的數據量最大的時候,一次性發送數據,適用於文件傳輸。
二、linux 方面
最大句柄數修改:長連接的接入,首先需要優化的就是 Linux 內核參數,其中 Linux 最大文件句柄數是最重要的調優參數之一,默認單進程打開的最大句柄數是 1024,當單個推送服務接收到的鏈接超過上限后,就會報“too many open files”,所有新的客戶端接入將失敗。通過 ulimit -a 可以查看相關參數
通過 vi /etc/security/limits.conf 添加如下配置參數:修改之后保存,注銷當前用戶,重新登錄,通過 ulimit -a 查看修改的狀態是否生效。
注意:該參數可以將單個進程打開的最大句柄數修改的非常大,但是當句柄數達到一定數量級之后,處理效率將出現明顯下降,因此,需要根據服務器的硬件配置和處理能力進行合理設置,並非越大越好。