编译 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 。