在 Linode 上编译 hybla 模块

2016/12/27 23:22 下午 posted in  OS

考试复习期间,不想复习,搞搞其他东西散散心,发现shadowsocks 有关于 TCP Fast Open 的更新,看说明的过程还发现了官方的速度优化指南,尝试优化自己的 ss 速度,然而报错。

执行到这一步时运行出错

sysctl --system
...
sysctl: setting key "net.ipv4.tcp_congestion_control": No such file or directory
net.ipv4.tcp_congestion_control = hybla
* Applying /etc/sysctl.conf ...

Google 一番后发现是缺少 tcp_hybla 模块,需要自己手动编译。引用一下 https://plus.google.com/+BoluoKING/posts/dLyYhBf3mwp 的科普

中美之间的线路质量不是很好,rtt较长且时常丢包。TCP的设计目的是解决不可靠线路上可靠传输的问题,即为了解决丢包,但丢包却使TCP传输速度大幅下降。HTTP协议在传输层使用的是TCP协议,所以网页下载的速度就取决于TCP单线程下载的速度(因为网页就是单线程下载的)。丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。
Linux内核中提供了若干套TCP拥塞控制算法,这些算法各自适用于不同的环境。

1)reno是最基本的拥塞控制算法,也是TCP协议的实验原型。
2)bic适用于rtt较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是2.6.8到2.6.18之间的Linux内核的默认算法。
3)cubic是修改版的bic,适用环境比bic广泛一点,它是2.6.19之后的linux内核的默认算法。
4)hybla适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。
我们需要做的工作就是将TCP拥塞控制算法改为hybla算法,并且优化TCP参数。

于是又开始找 hybla 模块的编译指南,参考了这两篇文章,并且修改了一下不太明确的地方,写个修改版的指南吧。

编译过程

查看自己 vps 内核版本:

$ uname -a
4.8.3-x86_64-linode76

下载对应版本的内核源码

在这里下载 https://www.kernel.org/pub/linux/kernel/

我这里是 4.8.3,于是进入 v4.x 目录,向下翻即找到了,复制文件地址,在vps上 wget 下载下来

mkdir kernel  
cd kernel  
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.3.tar.gz 
tar xzvf linux-4.8.3.tar.gz

注意修改对应的下载地址和文件名

安装内核编译和工具

apt-get install build-essential libncurses5-dev module-init-tools

配置内核编译文件

cd linux-4.8.3  
zcat /proc/config.gz > .config

然后用你喜欢的编辑器编辑 .config 文件,查找 CONFIG_TCP_CONG_CUBIC=y,在这一行下面增加一行

CONFIG_TCP_CONG_HYBLA=y

然后编译

make

编译耗时约15~20分钟

准备编译模块

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

以下是 hybla 所用的 Makefile

# Makefile for tcp_hybla.ko
obj-m := tcp_hybla.o  
KDIR := /tmp/kernel/linux-4.8.3  
PWD := $(shell pwd)  
default:  
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

注意上面第三行 KDIR := /root/kernel/linux-3.11.6 要修改成自己解压的目录,并且最后一行必须以 tab 开头,不可以用空格,不可以用空格。不懂Makefile的规则,我在这里踩了坑。

开始编译模块

这里退回到 linux-4.8.3 目录,我是放在 /tmp/kernel 内的,后面目录相关的就不提示了

cd /tmp/kernel/linux-4.8.3
make modules 

加载模块

cd /tmp/kernel/linux-4.8.3/net/ipv4  
insmod ./tcp_hybla.ko 

如果遇到command not found: insmod则需要手动安装

apt-get install module-init-tools  

如果编译的时候如果出现如下错误

scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory

需要源安装libssl-dev就可以了

后记

至此就装好了hybla 模块,后面继续按照 优化指南 优化去了