编译 Linode 内核模块小白教程,以 tcp_hybla 为例

2014-05-28 23:41:04 +08:00
 interdev
国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,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 ) ...
30295 次点击
所在节点    Linux
45 条回复
XXOO
2014-05-28 23:45:49 +08:00
不错。感谢。ubuntu14可以用么?
AstroProfundis
2014-05-28 23:46:01 +08:00
Mark

不过我现在是自己打包 linux-linode 内核用了...没错我是服务器上用 Arch 的奇葩_(:зゝ∠)_
https://github.com/AstroProfundis/linux-linode
interdev
2014-05-28 23:53:26 +08:00
@XXOO 当然可以,注意版本号照做就能编译出来了。
XXOO
2014-05-29 00:18:41 +08:00
@interdev 好的。我应该用哪个版本号,谢谢
interdev
2014-05-29 00:29:43 +08:00
@XXOO uname -r 显示的就是版本号
看得懂上面9步所有命令就照做,看不懂最好不要编译,免得搞死了机器。



一大堆收藏通知...
只收藏不回复,小心回家打屁股 :)
XXOO
2014-05-29 00:31:03 +08:00
@interdev 哈哈。谢谢。看懂了。
XXOO
2014-05-29 00:58:23 +08:00
加了这个:

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
interdev
2014-05-29 01:00:55 +08:00
sysctl net.ipv4.tcp_congestion_control 显示 hybla 就成功了。
Nin
2014-05-29 01:06:12 +08:00
其实官方文档有篇pvgrub的文章,照着那样做加一句话就行了
davidyin
2014-05-29 01:06:46 +08:00
这算是黑科技diy么?
interdev
2014-05-29 01:09:12 +08:00
@Nin 在哪,求请URL
infong
2014-05-29 01:15:00 +08:00
马克,回头试试。。。
XXOO
2014-05-29 03:49:16 +08:00
我测试了:开启前5m/s,开启后200k/s 看youtube。。。。楼下补充
marklrh
2014-05-29 06:06:26 +08:00
@XXOO 惨...开启前5MB/S? 啥ISP啊
rhwood
2014-05-29 09:09:27 +08:00
@Nin 官方文档重新编译ubuntu14.04有点问题的。比如默认压根没装grub,menu.lst照文档写也不对。
@interdev 改成hybla有多大改善,我改了没什么作用,已经放弃
zjgood
2014-05-29 09:33:18 +08:00
正需要,感谢
pfipdaniel
2014-05-29 09:59:06 +08:00
涨姿势了,第一次知道还有这样的模块,看来是我孤陋寡闻了,回去在自己的DO上试试,看看效果怎么样,话说现在DO上用ss连360p都看不了,郁闷的很。。。
Nin
2014-05-29 10:00:12 +08:00
@interdev https://library.linode.com/custom-instances/pv-grub-custom-compiled-kernel
@rhwood 那你可以试试楼主的办法,我是在Debian 7的环境下用原内核配置文件编译的,启动一切正常,光是改一个hybla没什么用处,其他的参数也要调整。我改了之后速度大概提升了4倍左右。相反我改成htcp倒是没什么改变。
mikj
2014-05-29 10:05:10 +08:00
32个赞给楼主
interdev
2014-05-29 10:06:46 +08:00
@pfipdaniel DO不用编译,我do上的ubuntu官方内核自带了,用 sysctl net.ipv4.tcp_congestion_control=hybla 加载即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/114788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX