提高 Linux上socket 性能的技巧 動態優化 GNU/Linux TCP/IP 棧
本文內容包括Linux下對于 Sockets API 的使用、兩個可以提高性能的 socket 選項以及 GNU/Linux 優化。為了能夠開發性能卓越的應用程序,請遵循以下技巧:最小化報文傳輸的延時;最小化系統調用的負載;為 Bandwidth Delay Product 調節 TCP 窗口;動態優化 GNU/Linux TCP/IP 棧。
動態優化 GNU/Linux TCP/IP 棧:
標準的 GNU/Linux 發行版試圖對各種部署情況都進行優化。這意味著標準的發行版可能并沒有對您的環境進行特殊的優化。
解決方案
GNU/Linux 提供了很多可調節的內核參數,您可以使用這些參數為您自己的用途對操作系統進行動態配置。下面我們來了解一下影響 socket 性能的一些更重要的選項。
在 /proc 虛擬文件系統中存在一些可調節的內核參數。這個文件系統中的每個文件都表示一個或多個參數,它們可以通過 cat 工具進行讀取,或使用 echo 命令進行修改。清單 3 展示了如何查詢或啟用一個可調節的參數(在這種情況中,可以在 TCP/IP 棧中啟用 IP 轉發)。
清單 3. 調優:在 TCP/IP 棧中啟用 IP 轉發
- [root@camus]# cat /proc/sys/net/ipv4/ip_forward
- 0
- [root@camus]# echo "1" > /poc/sys/net/ipv4/ip_forward
- [root@camus]# cat /proc/sys/net/ipv4/ip_forward
- 1
- [root@camus]#
表 1 給出了幾個可調節的參數,它們可以幫助您提高 Linux TCP/IP 棧的性能。
可調節的參數 |
默認值 |
選項說明 |
||||||
|
"110592" |
定義默認的接收窗口大小;對于更大的 BDP 來說,這個大小也應該更大。 |
||||||
/proc/sys/net/core/rmem_max |
"110592" |
定義接收窗口的***大小;對于更大的 BDP 來說,這個大小也應該更大。 |
||||||
/proc/sys/net/core/wmem_default |
"110592" |
定義默認的發送窗口大小;對于更大的 BDP 來說,這個大小也應該更大。 |
||||||
/proc/sys/net/core/wmem_max |
"110592" |
定義發送窗口的***大小;對于更大的 BDP 來說,這個大小也應該更大。 |
||||||
|
|
啟用 RFC 1323 定義的 window scaling;要支持超過 64KB 的窗口,必須啟用該值。 |
||||||
/proc/sys/net/ipv4/tcp_sack |
"1" |
啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段);(對于廣域網通信來說)這個選項應該啟用,但是這會增加對 CPU 的占用。 |
||||||
/proc/sys/net/ipv4/tcp_fack |
"1" |
啟用轉發應答(Forward Acknowledgment),這可以進行有選擇應答(SACK)從而減少擁塞情況的發生;這個選項也應該啟用。 |
||||||
/proc/sys/net/ipv4/tcp_timestamps |
"1" |
以一種比重發超時更精確的方法(請參閱 RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。 |
||||||
/proc/sys/net/ipv4/tcp_mem |
"24576 32768 49152" |
確定 TCP 棧應該如何反映內存使用;每個值的單位都是內存頁(通常是 4KB)。***個值是內存使用的下限。第二個值是內存壓力模式開始對緩沖區使用應用壓力的上限。第三個值是內存上限。在這個層次上可以將報文丟棄,從而減少對內存的使用。對于較大的 BDP 可以增大這些值(但是要記住,其單位是內存頁,而不是字節)。 |
||||||
/proc/sys/net/ipv4/tcp_wmem |
"4096 16384 131072" |
為自動調優定義每個 socket 使用的內存。***個值是為 socket 的發送緩沖區分配的最少字節數。第二個值是默認值(該值會被 wmem_default 覆蓋),緩沖區在系統負載不重的情況下可以增長到這個值。第三個值是發送緩沖區空間的***字節數(該值會被 wmem_max 覆蓋)。 |
||||||
/proc/sys/net/ipv4/tcp_rmem |
"4096 87380 174760" |
與 tcp_wmem 類似,不過它表示的是為自動調優所使用的接收緩沖區的值。 |
||||||
/proc/sys/net/ipv4/tcp_low_latency |
"0" |
允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項應該禁用。 |
提示:下面介紹一個有關***性配置的問題。注意,如果您重新啟動了 GNU/Linux 系統,那么您所需要的任何可調節的內核參數都會恢復成默認值。為了將您所設置的值作為這些參數的默認值,可以使用 /etc/sysctl.conf 在系統啟動時將這些參數配置成您所設置的值。
【編輯推薦】