最近開始着手靜態cdn節點的速度優化,由於網絡層指標可以比較精確的量化單次cdn流量(從發起數據請求到完成數據下載的整個過程)的各個階段耗時,因此優化會從整個網絡層時間線展開;
1、初始擁塞窗口值調整可行性
上圖為現代瀏覽器從數據請求、下載到渲染的整個過程;我們關心的部分主要是紅色框內的這幾個階段,主要分成dns請求,請求,響應這3個階段;在繼續細分后,我們主要會針對dns時間,建立連接時間,等待響應時間,內容下載時間這幾個方面開始優化;
google工程師Yuchung Cheng在<<Let’s make TCP faster>>一文給出了幾個tcp協議層的優化點並通過內部測試驗證了這些優化點的效果,它們分別是:
– Increase TCP initial congestion window
– Reduce the initial timeout from 3 seconds to 1 second
– Use TCP Fast Open (TFO)
– Use Proportional Rate Reduction for TCP (PRR)
其中,內核未提供直接修改RTO時間的接口,TFO需要客戶端和服務器的雙邊支持,PRR已經在3.2以上的內核默認開啟;看起來我們能優化的點只能是init_cwnd(初始擁塞窗口)值了;
2、初始擁塞窗口值取值
較大的初始擁塞窗口值雖然能顯式的提高內容下載速度,但是相對應的丟包率和重傳率也會顯著上升,因此這個取值需要兼顧下載速度和可用性等多方面來確定;
我們主要通過探測行業競品的取值來確定自己產品的取值,畢竟行業內幾個大佬已經在該領域摸爬滾打N年,早已摸索出了合理的初始擁塞窗口值了,這么干能省下不少事兒;
1)初始擁塞窗口值估計方法
通過三次握手階段的syn,syn+ack,ack來計算RTT時間,然后計算從第一個服務器響應包(時間戳r1)開始到r1+RTT時間段內的服務器數據包個數,此r1-r1+RTT時間段內的數據包個數可近似認為是初始擁塞窗口值;
比如:
測試url : http://img5.dwstatic.com/www/1404/261510188736/1431050996364.jpg
IP: xxx.xxx.xxx.xxx
域名:img5.dwstatic.com
RTT: 28號包減27號包
4.460638000-4.393042000=0.067596
號包4.555419000+0.067596=4.623015
因此,在32號至47號包之間,init_cwnd初始擁塞窗口為10
2)自動化的估值工具
工具主要自動化以下的執行步驟,通過海量樣本取平均的方法來最終計算出初始擁塞窗口近似值;
1
2
3
4
5
6
7
8
9
10
11
12
13
|
使用測試
Url:http://img5.dwstatic.com/www/1404/261510188736/1431050996364.jpg
1)獲取當前需要測試的目標cdn節點ip
163.177.134.29
2)使用tcpdump抓包工具過濾出目標ip的收發數據報文並輸出pcap文件到目標位置
命令
DEMO:tcpdump -i em2 host 163.177.134.29 -w /home/uaq/opbin/xuye/local/cwnd_analyzer/tmp/test.pcap
3)使用腳本或手動重復N次curl測試url的靜態資源
4)使用分析工具通過“初始擁塞窗口值估計方法”計算出N次cwnd窗口值
5)輸出中位數和平均值
|
工具開源代碼地址見“6、資料”部分
3)行業大佬的取值分析
探測結果顯示,行業內各大cdn廠商都調整過init_cwnd值,普遍取值在10-20之間;
4)最終取值確定
取值初始擁塞窗口值:15
3、init_cwnd調整方法
1
2
3
4
5
6
|
1、ip route change default via XXXXXX initcwnd 15 //XXXXX為網關地址
示例:
ip route change default via 58.16.246.249 initcwnd 15
2、加入/etc/rc.local文件中
3、重啟服務器
|
4、init_cwnd值生效驗證
登陸目標機器后進行以下操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
1)yum install “kernel-devel-uname-r == $(uname -r)“
2)<a class="urlextern" title="http://debuginfo.centos.org/7/x86_64/" href="http://debuginfo.centos.org/7/x86_64/" rel="nofollow">http://debuginfo.centos.org/7/x86_64/</a>中找到對應版本的kernel-debuginfo和kernel-debuginfo-common兩個rpm包;
安裝:
rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-229.1.2.el7.x86_64.rpm
安裝:
rpm -ivh kernel-debuginfo-3.10.0-229.1.2.el7.x86_64.rpm
3)yum install systemtap
4)驗證systemtap;
驗證
1:stap -ve 'probe begin { log(“hello world”) exit () }'
驗證
2:stap -c df -e 'probe syscall.* { if (target()==pid()) log(name.” ”.argstr) }'
5)initcwnd.stp腳本
robe kernel.function("tcp_init_cwnd").return
{
printf("tcp_init_cwnd return: %d\n", $return)
}
6)獲取tcp_init_cwnd值;
stap initcwnd.stp
|
5、init_cwnd值調整后效果
centos 7.1默認init_cwnd 10,調整后init_cwnd 20;下載速度提升還是很明顯的;
使用mmtrix的監測工具:
6、資料
自動化遠程探測init_cwnd值工具;
https://github.com/fifa2002nb/detectcwnd