技术解析

编译 Linode 内核模块小白教程,以 tcp_hybla 为例
0
2021-07-13 04:37:57
idczone
国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,Linux 机器缺省的TCP协议发包算法是cubic,如果改为hybla,在掉包率高时可以大幅提高访问速度;如果cubic只能流畅观看480p的视频,改为hybla则可以流畅观看720p的视频,效果提升是明显的,但很多朋友不会编译内核模块,写个小白教程供大家参考,照以下几步操作一遍,你会发现编译内核模块原来相当简单。

以下教程每行#后面的为需要输入的命令,操作时需要root权限,需要你会使用vi,我的系统是Ubuntu 12.04.2 LTS,其他Linux系统命令不会差别很大,请按自己的情况修改内核名称。
1. 查看你的机器内核版本:
#uname -r
3.11.6-x86_64-linode35

2. 去 https://www.kernel.org/pub/linux/kernel/v3.0/ 下载相同版本的源码到任意目录,解压
#mkdir /root/mykernel
#cd /root/mykernel
#wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.11.6.tar.gz
#tar xzvf linux-3.11.6.tar.gz

3. 安装内核编译工具
#apt-get update && apt-get install -y build-essential libncurses5-dev

4. 复制Linode原来的内核编译配置文件到源码根目录,在CONFIG_TCP_CONG_CUBIC=y下面增加一行 CONFIG_TCP_CONG_HYBLA=y,再生成编译模块需要的内核
#cd linux-3.11.6
#zcat /proc/config.gz > .config
#vi .config
查找CONFIG_TCP_CONG_CUBIC=y,在下面增加一行 CONFIG_TCP_CONG_HYBLA=y,保存
#make

5. 耐心等待编译内核完成,单核编译大约需15分钟,完成后,进入模块所在的目录,编写Makefile
#cd net/ipv4/
#mv Makefile Makefile.old
#vi Makefile
以下是Makefle的内容,注意要把KDIR修改为你自己的源码路径,其他则照抄就可以了

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

6.进入源码根目录,编译模块
#cd /root/mykernel/linux-3.11.6/
#make modules

7.进入到模块所在目录,复制生成的 tcp_hybla.ko 到加载目录,测试加载模块
#cd /root/mykernel/linux-3.11.6/net/ipv4
#cp tcp_hybla.ko /root/mykernel/
#cd /root/mykernel/
加载前
#sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno
#insmod tcp_hybla.ko
加载后
#sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno hybla
设置hybal为优先
#sysctl net.ipv4.tcp_congestion_control=hybla

8.设置开机自动加载模块,把tcp_hybla.ko 复制到 /lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4
#cd /lib/modules/3.11.6-x86_64-linode35
#mkdir -p kernel/net/ipv4
#cd kernel/net/ipv4
#cp /root/mykernel/tcp_hybla.ko ./
#cd /lib/modules/3.11.6-x86_64-linode35
#depmod -a

9.修改/etc/sysctl.conf 开机自动设置hybal为优先
#vi /etc/sysctl.conf
net.ipv4.tcp_congestion_control = hybla

用这9步就可以了,只是动态加载模块,不用更换内核,不用停机重启,不影响网站正常运营,相当方便,值得尝试,参考这个方法可以为 Linode 动态加载任何需要的内核模块,如fastopen,htcp,highspeed 等,有任何问题请到推上找我交流 @interwebdev ,转载请注明出处( http://www.fslk.net/?p=822 ) ...
不错。感谢。ubuntu14可以用么?

Mark
不过我现在是自己打包 linux-linode 内核用了...没错我是服务器上用 Arch 的奇葩_(:зゝ∠)_
https://github.com/AstroProfundis/linux-linode

当然可以,注意版本号照做就能编译出来了。

好的。我应该用哪个版本号,谢谢

uname -r 显示的就是版本号
看得懂上面9步所有命令就照做,看不懂最好不要编译,免得搞死了机器。

一大堆收藏通知...
只收藏不回复,小心回家打屁股 :)

哈哈。谢谢。看懂了。

加了这个:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = hybla

sysctl net.ipv4.tcp_congestion_control 显示 hybla 就成功了。

其实官方文档有篇pvgrub的文章,照着那样做加一句话就行了

这算是黑科技diy么?

在哪,求请URL

马克,回头试试。。。

我测试了:开启前5m/s,开启后200k/s 看youtube。。。。楼下补充

惨...开启前5MB/S? 啥ISP啊

官方文档重新编译ubuntu14.04有点问题的。比如默认压根没装grub,menu.lst照文档写也不对。
改成hybla有多大改善,我改了没什么作用,已经放弃

正需要,感谢

涨姿势了,第一次知道还有这样的模块,看来是我孤陋寡闻了,回去在自己的DO上试试,看看效果怎么样,话说现在DO上用ss连360p都看不了,郁闷的很。。。

https://library.linode.com/custom-instances/pv-grub-custom-compiled-kernel
那你可以试试楼主的办法,我是在Debian 7的环境下用原内核配置文件编译的,启动一切正常,光是改一个hybla没什么用处,其他的参数也要调整。我改了之后速度大概提升了4倍左右。相反我改成htcp倒是没什么改变。

32个赞给楼主

DO不用编译,我do上的ubuntu官方内核自带了,用 sysctl net.ipv4.tcp_congestion_control=hybla 加载即可。

电信

ubuntu直接用官方内核就有hybla,不需要自己编译。。。。
就是不要用linode提供的内核,用ubuntu提供的

Linode 官方这么使用官方的内核,谢谢。

马克

我是说,ubuntu发行版带的内核有hybla,https://library.linode.com/custom-instances/pv-grub-howto

请问,archlinux没有hybla模块怎么搞,谢谢

请教...在Ubuntu14.04下编译hybla...执行到第八步报错
[email&depmod -a
depmod: WARNING: could not open /lib/modules/3.12.9-x86_64-linode37/modules.order: No such file or directory
depmod: WARNING: could not open /lib/modules/3.12.9-x86_64-linode37/modules.builtin: No such file or directory
什么情况...

/lib/modules/3.12.9-x86_64-linode37

目录不对,应该用自己的内核,不是3.12.9

我用的就是3.12.9的内核...


Same here.

我这也是 No such file or directory
用uname -r对着的版本号进的目录啊,求解~(Linode Ubuntu 14.04.1 LTS )
你们解决了吗?




这个问题我也碰到了,我就到那个目录里面
```
touch modules.order
touch modules.builtin
```
弄了两个空文件,然后就没警告信息,就过去了

我用的debian,在/etc/modules文件中加入一行tcp_hybla,开机就可以自动载入

我开机还是无法自动加载。在测试模块的时候一切正常,touch之后depmod -a也执行而没有报错,但是reboot之后输入sysctl net.ipv4.tcp_available_congestion_control依然还是不显示,需要手动加载,很奇怪。我的sysctl.conf似乎也没用。如果能解答就好了,谢谢。

你们这个问题解决了吗?

木~~~~貌似也没什么影响

我测试了,vultr的centos 7系统,默认是支持hybla算法的。启用后发现youtube 4K的速度慢了很多,关闭后正常,粗略地来回测试了几次,最后决定删除net.ipv4.tcp_congestion_control = hybla这句话。到底什么原因不清楚,或许我单位的网络比较好,本身到vultr节点的质量已经够好了。

ping一下大概多少,ttl呢?Vultr哪个节点?

time=86ms TTL=45 东京的节点

延迟确实比较好。我发现我的也是用hybla性能反而降了。

谁说vultr centos 7 支持hybla的。。。net.ipv4.tcp_available_congestion_control = cubic reno

成功了,谢谢

大神求助啊,现在用 4.1.5 的最新内核,到 make 再生成编译模块需要的内核报错了,
kernel/Makefile:135: *** No X.509 certificates found ***
这是什么原因呢?要怎么解决?

同楼上。。 kernel/Makefile:135: *** No X.509 certificates found ***

已找到原因。需要在$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 这行前面加一个 TAB 。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服