調(diào)優(yōu):跨境鏈路上改哪幾個(gè)內(nèi)核參數(shù)最管用)
跨境傳輸速度上不去很多時(shí)候不是帶寬不夠是TCP協(xié)議棧的參數(shù)沒調(diào)對(duì)。默認(rèn)配置是為低延遲、低丟包的網(wǎng)絡(luò)設(shè)計(jì)的放到跨太平洋鏈路上就是水土不服。調(diào)哪些參數(shù)能明顯改善速度列幾個(gè)實(shí)測(cè)有效的方向。一、先把擁塞控制算法換了這是改動(dòng)最小、效果最明顯的一步。Linux 4.9以上內(nèi)核內(nèi)置了BBR默認(rèn)沒開目前大多數(shù)服務(wù)器還在跑cubic。cubic的邏輯是“丟包等于擁塞”檢測(cè)到丟包就主動(dòng)降速。跨境鏈路丟包是常態(tài)cubic會(huì)頻繁踩剎車帶寬買再多也跑不上去。BBR的思路不一樣它持續(xù)測(cè)量鏈路的實(shí)際帶寬和最小RTT在兩者之間找平衡點(diǎn)——把帶寬跑滿同時(shí)盡量不讓數(shù)據(jù)在中間設(shè)備緩存里堆積。實(shí)測(cè)數(shù)據(jù)BBR部署后吞吐量提升20%-50%的情況很常見。開啟方式只需要兩行配置textnet.core.default_qdisc fq net.ipv4.tcp_congestion_control bbr寫進(jìn)/etc/sysctl.conf執(zhí)行sysctl -p生效。用sysctl net.ipv4.tcp_congestion_control確認(rèn)切換成功。二、緩沖區(qū)大小要擴(kuò)跨境場(chǎng)景下默認(rèn)值不夠用TCP傳輸依賴接收窗口和發(fā)送窗口窗口大小決定了單條連接能跑多快。窗口太小就算帶寬充足數(shù)據(jù)也發(fā)不出去。公式是吞吐量 窗口大小 / RTT。RTT 200ms的鏈路上要達(dá)到100Mbps吞吐量窗口需要2.5MB。默認(rèn)的緩沖區(qū)往往只有幾十KB遠(yuǎn)不夠用。跨境場(chǎng)景下把緩沖區(qū)擴(kuò)到16MB比較穩(wěn)妥留足余量textnet.core.rmem_max 134217728 net.core.wmem_max 134217728 net.ipv4.tcp_rmem 4096 87380 134217728 net.ipv4.tcp_wmem 4096 65536 134217728四個(gè)參數(shù)的含義rmem/wmem分別是接收和發(fā)送緩沖區(qū)max是上限后面的三個(gè)值是“最小-默認(rèn)-最大”。tcp_rmem和tcp_wmem的默認(rèn)值和最大值決定了每條TCP連接的實(shí)際可用窗口。三、TIME_WAIT積壓會(huì)拖慢建連速度大量短連接場(chǎng)景下主動(dòng)關(guān)閉連接的一端會(huì)積累大量TIME_WAIT狀態(tài)。系統(tǒng)默認(rèn)TIME_WAIT要等2MSL約60秒才能釋放端口端口資源消耗快了新連接就可能建不起來(lái)。兩個(gè)參數(shù)配合使用textnet.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30tcp_tw_reuse允許新連接復(fù)用TIME_WAIT狀態(tài)的socket注意只在出站連接有效tcp_fin_timeout縮短FIN-WAIT-2的等待時(shí)間。同時(shí)檢查本地端口范圍夠不夠textnet.ipv4.ip_local_port_range 1024 65000默認(rèn)范圍通常是32768-60999高并發(fā)場(chǎng)景下可能不夠用擴(kuò)到1024-65000能緩解端口耗盡。四、隊(duì)列長(zhǎng)度調(diào)大防止高并發(fā)時(shí)連接被丟棄高并發(fā)場(chǎng)景下連接隊(duì)列滿了新連接就會(huì)被丟掉用戶端表現(xiàn)為“連不上”。兩個(gè)隊(duì)列參數(shù)值得調(diào)textnet.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 net.core.netdev_max_backlog 10000somaxconn控制已完成三次握手的連接隊(duì)列長(zhǎng)度tcp_max_syn_backlog控制半連接隊(duì)列SYN_RECV狀態(tài)長(zhǎng)度netdev_max_backlog是網(wǎng)卡收包隊(duì)列。默認(rèn)值128和1024流量稍微上來(lái)就不夠用。注意sysctl調(diào)了之后應(yīng)用層也要同步調(diào)。Nginx的listen指令、Redis的tcp-backlog、Java的ServerSocket構(gòu)造函數(shù)都有自己的backlog參數(shù)最終取的是sysctl值和應(yīng)用層值兩者中的較小值。系統(tǒng)調(diào)大而應(yīng)用沒調(diào)等于白改。一次完整的參數(shù)配置把下面這些寫進(jìn)/etc/sysctl.conf然后sysctl -p生效textnet.core.default_qdisc fq net.ipv4.tcp_congestion_control bbr net.core.rmem_max 134217728 net.core.wmem_max 134217728 net.ipv4.tcp_rmem 4096 87380 134217728 net.ipv4.tcp_wmem 4096 65536 134217728 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 net.ipv4.ip_local_port_range 1024 65000 net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 net.core.netdev_max_backlog 10000調(diào)完后用iperf3跑個(gè)測(cè)試對(duì)比前后數(shù)據(jù)能看到明顯變化。跨境鏈路上這幾個(gè)參數(shù)帶來(lái)的提升比其他花哨的優(yōu)化手段都實(shí)在。