最近开始着手静态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