天天看點

網絡開發注意事項

自己實作server時,一定要對核心TCP有關的參數做一些調整,才能使系統的吞吐量處于最佳值。需要注意的是建立連接配接的吞吐量,網絡IO吞吐量,以及連接配接關閉的處理。

我們在做性能測試的時候也許會發現,機器的硬體配置很好,但不管我們怎麼調整并發數,機器的load就是一點也上不去。這種情況一般都是由于作業系統建立連接配接成為瓶頸。在建立連接配接的三次握手過程中,Linux核心使用到兩個隊列:

未完成隊列,處于SYN_RECV狀态的socket隊列

已完成隊列,處于ESTABLISHED但沒有被應用accept的socket隊列

我們要調整兩個參數:/etc/sysctl.conf

net.ipv4.tcp_max_syn_backlog 未完成隊列的最大長度,建議設為20480。

net.core.somaxconn 已完成隊列的最大長度,建議設為20480。

系統關于上面兩個配置的預設值很小,隻有200多。如果自己開發server,一定要修改這兩個配置。可以通過 /sbin/sysctl -a | grep xxx來檢視。修改完後sysctl -p 重新載入核心參數。

應用在listen()傳入的backlog也用來指定已完成隊列長度,系統取值為 min(listen_backlog, net.core.somaxconn)。是以建議在調用listen時傳入很大的backlog值。

如果應用調用accept()不及時,随着新連接配接的建立,已完成隊列和未完成隊列會先後達到容量上限,無法建立新的連接配接。

sendQ太小,網絡的輸出吞吐量就上不去,tps也會上不去。而滑動視窗的大小受到對端recvQ的大小限制,是以recvQ也不能太小。

/etc/sysctl.conf 中有幾個參數可以修改socket的sendQ和recvQ的大小。

net.ipv4.tcp_rmem = 4096 4096 16777216 // 設定讀寫緩沖區 min default max

net.ipv4.tcp_wmem = 4096 4096 16777216

net.ipv4.tcp_mem = 196608 262144 393216 //機關:頁

修改/etc/sysctl.conf中的以下參數,

net.ipv4.tcp_fin_timeout 主動關閉連接配接一方在FIN_WAIT2狀态的逾時時間,不會因為沒有收到對端的FIN包而一直處于FIN_WAIT2。

net.ipv4.tcp_tw_reuse 直接重用TIME_WAIT狀态的socket

net.ipv4.tcp_tw_recycle 回收利用TIME_WAIT狀态的socket,不知道跟tcp_tw_reuse有什麼差別。

改為 sessionConfig.setSoLinger(-1)

netstat -s列舉出各種網絡事件的次數。從中也可以找到一些線索。

繼續閱讀