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