腾讯单边拥塞算法TCPA(TCP黑科技加速)
腾讯内部使用的TCPA,由腾讯TEG操作系统组研发,基于RHEL7.4源码,定制化的TCPA。最早是通过https://linux.qq.com/?p=238 发布了,现在官方已经删除了!
1.1、TEG团队介绍
腾讯TEG操作系统组, 2010年成立,专业的内核团队,维护研发腾讯内部linux操作系统tlinux, 保证百万级server高效稳定运行,为腾讯业务提供有力支撑。
1.2、TCPA优势和劣势
优势:TCPA启用后,小文件比BBR能提升40%以上,大文件比BBR能提升 5% ~ 10%。TCPA的优势在于小文件的性能提升,程序也默认仅加速网站端口(80/443/8080),所以更适用于建站场景。
劣势:CentOS单一系统、源程序未开源、加速端口需要手工指定
1.3、TCPA 原理
上图是 TCPA,发送数据包和接收应答包后的处理逻辑图。一共包括 9 个模块。应用程序通过 Sendfile,Write 等发送的后,交由内核的数据包构建模块来处理,最终生成一个个 SKB 并放入发送队列中。平缓发送模块,根据拥塞控制模块所产生的发送速度/发送窗口值来平缓地将这些数据(无论是新数据,还是重传数据)发送到网络中,本身并不会决策发送的速率,只会按照给定的速度/发送窗口来执行。
超时模块用来决策哪些数据包超时,并重传,最终会交给平缓发送模块来发送。Probe 探测模块,是依据网络的特定需要,构造一些数据包来探测网络的质量情况。发送是交给平缓发送模块来发送,接收到的应答包,会将 Probe 应答包交给 Probe 模块来处理。
收到应答包后,如果有 SACK 则单独处理 SACK,SACK 的处理逻辑比较复杂,需要知道哪些数据包被应答,哪些未被应答,需要对重传队列进行标记。并且也会根据 SACK 中的应答来判断哪些报文丢包了,当前网络中的 RTT 值变化等。这里会给丢包检测模块,拥塞控制模块提供判断信息。丢包检测模块,用来判断哪些数据包已经丢弃,比如快速重传,RACK 等算法。这里只去标记丢弃的报文,具体的重传由重传包处理模块来执行。
拥塞控制算法,用来判断当前网络链接情况,并据此来决定当前发送的速度和发送窗口值。不同的拥塞算法所依赖的判断信息不同。 窗口的增减均由这里来判断。这里会依赖 SACK 模块,丢包检测模块,RTO 超时模块,Probe 模块等给予关键信息。重传数据包模块和新数据发送模块相对比较简单,将数据整理好后,交给平缓发送模块来发送。
总的来说,TCPA 的修改不仅仅是对拥塞算法的修改,也对收发包的整个逻辑进行了重构。对于系统已有的功能,我们额外还提供了可调整的参数接口,供使用。比如小表中列举了部分调整的参数:
cat >> /etc/sysctl.conf << TEMPEOF net.core.wmem_max = 3276800 net.ipv4.tcp_fack = 0 net.ipv4.tcp_init_cwnd = 10 net.ipv4.tcp_loss_init_cwnd = 1 net.ipv4.tcp_mem = 379479 505972 758958 net.ipv4.tcp_metrics_minrtt = 0 net.ipv4.tcp_rto_max = 120 net.ipv4.tcp_rto_min = 200 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_wmem = 4096 16384 4194304 TEMPEOF 运行下面命令,修改配置生效 sysctl -p
2、测试环境
2.1、TCPA环境要求
系统:centos7
分区:/boot分区≥500M(太小会安装失败,这是因为分区容量太少,没空间自定义安装内核)
内核:默认内核版本
其他包:升级到最新包
2.2、检查当前 CentOS 信息
修改root密码
2.2、检查当前 CentOS 信息
修改root密码
passwd
检查当前 CentOS 系统内核版本
cat /etc/redhat-release
查看当前/boot分区,一般vps都只有一个分区
df -h
可以看出当前系统为 CentOS 7.*,系统内核版本
uname-sr
查看vps IP
ip addr show
运行 yum 命令升级
yum clean all
yum update -y
yum install wget -y
2.3、安装docker环境、部署测试应用
配置docker 容器环境
curl -sSL https://get.docker.com/ | sh
sudo systemctl enable docker.service
sudo systemctl start docker.service
配置容器web管理界面
docker run -d -p 9000:9000 --label owner=portainer \
--restart=always --name=ui \
--label owner=portainer \
-v /var/run/docker.sock:/var/run/docker.sock \
lihaixin/portainer -l owner=portainer
配置speedtest测试工具
docker run -d --name speedtest --restart=always -p 0.0.0.0:80:80 lihaixin/speedtest
docker run -d --name speedtest --restart=always -p 0.0.0.0:46666:80 lihaixin/speedtest
docker run -d --name speedtest --restart=always -p 0.0.0.0:46667:80 lihaixin/speedtest
访问:http://ip:port进行测试
3、使用方法
3.1、手工安装
安装必要依赖:
yum -y install net-tools
更换系统内核
wget http://down.08mb.com/tcp_opz/tcpa/kernel-3.10.0-693.5.2.tcpa06.tl2.x86_64.rpm
rpm -ivh kernel-3.10.0-693.5.2.tcpa06.tl2.x86_64.rpm --force
reboot
下载安装主程序:
wget http://down.08mb.com/tcp_opz/tcpa/tcpa_packets_180619_1151.tar.gz
tar xf tcpa_packets_180619_1151.tar.gz
cd tcpa_packets
sh install.sh
TCPA(默认只加速80,443,8080这3个端口),如需新增加速端口:
vi /usr/local/storage/tcpav2/start.sh
第46行后添加:
$BINDIR/$CTLAPP access add tip $ip tport 自定义端口
启动tcpa拥塞算法:
cd /usr/local/storage/tcpav2
sh start.sh
查看是否开启成功
lsmod|grep tcpa
看到类似下面内容,代表成功安装
tcpa_engine 2242490
卸载方法:
cd /usr/local/storage/tcpav2
sh uninstall.sh
3.2、自动安装
TCPA一键包:
wget http://down.08mb.com/tcp_opz/tcpa/tcpa.sh
sh tcpa.sh
使用说明:一键包会自动安装依赖(仅epel-release、net-tools)和内核并重启,重启后安装自动完成无需人工干预。
TCPA(默认只加速80,443,8080这3个端口),如需新增加速端口:
vi /usr/local/storage/tcpav2/start.sh
第46行后添加:
$BINDIR/$CTLAPP access add tip $ip tport 自定义端口
类似下面这样添加444端口
启动tcpa:
cd /usr/local/storage/tcpav2
sh start.sh
卸载tcpa:
cd /usr/local/storage/tcpav2
sh uninstall.sh
3.3、博睿测试结果(官方提供)
同机房的2台OC机器,博睿上640KB小文件的测试结果:
海外机房数据传输:
从美国弗吉尼亚拷贝30MB的数据到中国天津
网络延时高(平均330ms), 带宽上限是10Mb/s。
传输多次求平均的平均传输速度对比(单位:KB/s)。
4、再次测试
4.1、访问http://ip,查看速度
开启tcpa测试速度比未开启之前速度提升差不多20倍。