修改TCP拥塞控制算法优化Linode的网络性能其实15年的时候就已经研究过了,确实获得明显的优化效果。不过当时用的是别人编译好的tcp_hybla.ko模块,而现在Linode内核已经更新,于是便照着网上的方式自行编译了一下内核模块同时也对知识进行一次梳理。配置编译内核确实是一件充满乐趣并且能学习到很多Linux底层知识的事。参考网友的结论,hybla适合欧美节点的高延迟网络环境,htcp适合日本节点的低延迟网络环境,在实测过程中验证了htcp确实比较适合日本服务器节点的性能优化。

1、确认支持的TCP拥塞控制算法及内核版本号
sysctl net.ipv4.tcp_available_congestion_control
显示
net.ipv4.tcp_available_congestion_control = cubic reno

uname -r
显示
3.16.5-x86_64-linode46

2、安装编译需要用到的软件

yum install -y gcc gcc-c++ kernel-devel

3、推荐将内核源代码放到/usr/src/kernels/目录,拷贝linode内核(/proc/config.gz)配置文件至源码包位置

cd /usr/src/kernels/
wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.16.5.tar.gz
tar xzvf linux-3.16.5.tar.gz
cd linux-3.16.5
zcat /proc/config.gz > .config
vim .config

4、查找CONFIG_TCP_CONG_CUBIC=y,在下面增加以下两行并保存

CONFIG_TCP_CONG_HTCP=y
CONFIG_TCP_CONG_HYBLA=y

5、执行Make指令

make

6、编译过程时间看主机配置,我的主机大约运行了40分钟。接下来进入net/ipv4/文件夹修改Makefile文件使hybla和htcp可以以模块的方式生成。

cd net/ipv4/
mv Makefile Makefile.old
vim Makefile

生成tcp_hybla.ko(二选一)

# Makefile for tcp_hybla.ko
obj-m := tcp_hybla.o
KDIR := /usr/src/kernels/linux-3.16.5
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

生成tcp_htcp.ko(二选一)

# Makefile for tcp_htcp.ko
obj-m := tcp_htcp.o
KDIR := /usr/src/kernels/linux-3.16.5
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

7、执行make modules指令,如果两个模块都需要的话需要编辑Makefile,并重新运行一次make modules。

cd /usr/src/kernels/linux-3.16.5/
make modules

8、测试cubic、hybla、htcp算法的效果

cd net/ipv4/
insmod ./tcp_hybla.ko
insmod ./tcp_htcp.ko

使用sysctl -w net.ipv4.tcp_congestion_control=hybla临时切换TCP拥塞控制算法

使用sysctl net.ipv4.tcp_congestion_control指令查看当前的TCP拥塞控制算法

默认cubic算法,峰值稳定在2.5Mbps

cubic

hybla算法,峰值稳定在1.8Mbps

hybla

htcp算法,峰值稳定在6.7Mbps,1080p无压力(^o^)/YES!

htcp

同一时段切换这三种控制算法,经过多次比较基本排除网络不稳定的因素干扰,Linode日本节点实测效果可以确认htcp>cubic>hybla。

9、最后设置为开机自动加载

cd /lib/modules/3.16.5-x86_64-linode46/
cp /usr/src/kernels/linux-3.16.5/net/ipv4/tcp_htcp.ko ./
depmod -a
vim /etc/sysctl.conf

修改参数为

net.ipv4.tcp_congestion_control = htcp

保存即可

编译好的内核模块 http://soft.crz.me/?dir=linode/kernel_module/3.16.5