最新消息:用博客记录点滴生活。与您共同关注互联网,分享互联网。

Linode编译hybla htcp拥塞控制算法模块

由于某些原因,中美线路有时掉包率会很高,想要尝试尝试优化vps网速,查找资料发现linux内核中存在拥塞控制算法模块(hybla htcp)据说在掉包率高时可以大幅提高访问速度,如果linux默认拥塞控制算法cubic只能流畅观看480p的视频,改为hybla或者htcp则可以流畅观看720p的视频,本人使用的Linode但是Linode提供的内核中并不包含此种算法(只有cubic Reno),无奈只能选择自己编译,编译流程为下:

1. 查看vps内核版本:

uname -r
3.11.6-x86_64-linode35

Linode的内核为3.11.6-x86_64-linode35,下面的教程也以3.11.6内核为例,涉及到内核路径的自己修改替换即可。

2. 下载相同版本的内核源码

可以去https://www.kernel.org/pub/linux/kernel/v3.0/查找内核源码,找到后下载后缀为tar.gz的文件。

rm -rf linux-3.11.6.tar.gz 
mkdir kernel
cd kernel
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、安装内核编译工具

编译内核需要下面这些编译工具,不然会编译失败。

CentOS and Fedora
yum update && yum install -y ncurses-devel make gcc bc openssl-devel

Ubuntu and Debian
apt-get update && apt-get install -y build-essential libncurses5-dev module-init-tools

4、配置内核编译文件

由于我们只是要为内核增加hybla htcp模块,不需要更改其他功能,直接导出官方的配置文件再修改即可。

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

编辑.config文件,查找CONFIG_TCP_CONG_CUBIC=y,要编译hybla模块在下面一行增加 CONFIG_TCP_CONG_HYBLA=y,要编译htcp模块在下面一行增加CONFIG_TCP_CONG_HTCP=y,两个都要的话,都添加在下面。

编译模块

make

耐心等待编译内核完成,单核编译大约需15分钟

5、准备编译模块

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

有的人可能不同时需要两个模块,这里分开写,不同时编译,自己需要哪个编译那个。

5.1、以下是hybla模块的Makefle内容,注意要把KDIR修改为你自己的源码路径,其他则照抄就可以了。

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

5.2、以下是htcp模块的Makefle内容,注意要把KDIR修改为你自己的源码路径,其他则照抄就可以了。

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

6、开始编译模块

进入源码根目录,编译模块

cd /root/kernel/linux-3.11.6/
make modules

7、测试模块

这里以hybla模块为例,htcp模块的话自己替换一下名称即可。

cd /root/kernel/linux-3.11.6/net/ipv4
insmod ./tcp_hybla.ko
sysctl net.ipv4.tcp_available_congestion_control

如果成功加载的话会显示下面

net.ipv4.tcp_available_congestion_control = cubic reno hybla

自此为止可以说已经成功了。

8、设置开机自动加载模块

这里以hybla模块为例,htcp模块的话自己替换一下名称即可。

如果需要开机自动加载我们需要把模块复制到/lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4

mkdir -p /lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4
cd /lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4
cp -a /root/kernel/linux-3.11.6/net/ipv4/tcp_hybla.ko /lib/modules/3.11.6-x86_64-linode35/kernel/net/ipv4/
cd /lib/modules/3.11.6-x86_64-linode35
depmod -a

9、设置hybal为优先加载

这里以hybla模块为例,htcp模块的话自己替换一下名称即可。

编辑/etc/sysctl.conf在最后添加下面这行即可

net.ipv4.tcp_congestion_control = hybla

自此大功告成收工,实现了动态加载hybla htcp模块,并且实现了开机自动加载。


正文部分到此结束

声明:本文采用 BY-NC-SA 协议进行授权,转载还请注明:http://www.777s.me/linode-hybla-htcp.html - 777's Blog

  1. 做到第8步最后之前都很顺利,但是 depmod -a后提示错误:WARNING: could not open /lib/modules/4.1.0-x86_64-linode59/modules.order: No such file or directoryWARNING: could not open /lib/modules/4.1.0-x86_64-linode59/modules.builtin: No such file or directory不知道为什么。。。

      • 正确的,/lib/modules下面有除了新的这个4.1的之外还有2个是3.x的。这个4.1新的下面的有文件名modules不过后缀是其他格式,就是没有order和builtin。重装了好几遍都是这个错误。

  2. 现在linode的Debian 8.1不带kmod和module-init-tools了,非常坑,需要手动装一下…把这个坑更新进去吧,免得坑更多人…apt-get -y updateapt-get install module-init-tools

  3. 还有kernel.org上变成了v4.x和v3.x,虽然v3.0的写法还是通用的,但是却没有了v4.0和v4.1的写法…也是个坑。

  4. 第6步编译hypla模块时报错,显示如下:[root@li1163-31 linux-4.1.5]# make modules CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h CHK include/generated/bounds.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.shkernel/Makefile:135: *** No X.509 certificates found ***net/ipv4/Makefile:1: *** missing separator. Stop.make : *** [net/ipv4] Error 2make: *** [net] Error 2怎么办?

    • 试了分2次对hybla 和htcp ,Makefile分2次写入相应内容,然后make modules,倒是都可以加载,可以看见4个,hybla,htcp,cubic,reno 。

      2个照方法都写入Sysco.conf,配置开机加载,重启后,sysctl net.ipv4.tcp_available_congestion_control显示只有hybla, cubic,reno 3个,没有htcp。

  5. hi.

    [root@arx linux-3.10.1]# zcat /proc/config.gz > .config
    gzip: /proc/config.gz: No such file or directory
    [root@arx linux-3.10.1]#

    怎么没有config.gz文件呢?

      • hi.
        不是linode.是alpharacks.com的kvm vps:
        [root@arx linux-3.10.1]# uname -a
        Linux arx.brite.biz 3.10.0-123.4.2.el7.x86_64 #1 SMP Mon Jun 30 16:09:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
        [root@arx linux-3.10.1]#

        这跟是否为linode vps有关系吗

  6. 这一步cd /root/mykernel/linux-4.5
    -bash: cd: /root/mykernel/linux-4.5: No such file or directory
    这个是出了什么问题···

  7. [root@li1065-200 kernel]# insmod tcp_hybla.ko
    insmod: error inserting ‘tcp_hybla.ko': -1 Unknown symbol in module

    这个怎么办……. 明明下载的内核包也是一样的
    linux-4.5
    gcc是4.4
    听说可能跟GCC有关系 ?4.6以上的GCC才可以?

  8. CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh Building modules, stage 2. MODPOST 2767 modulesERROR: “nf_defrag_ipv4_enable” [net/netfilter/xt_socket.ko] undefined!ERROR: “nf_defrag_ipv4_enable” [net/netfilter/xt_TPROXY.ko] undefined!ERROR: “__nf_nat_mangle_tcp_packet” [net/netfilter/ipvs/ip_vs_ftp.ko] undefined!ERROR: “xfrm4_tunnel_register” [net/ipv6/sit.ko] undefined!ERROR: “xfrm4_tunnel_deregister” [net/ipv6/sit.ko] undefined!ERROR: “inet_diag_unregister” [net/dccp/dccp_diag.ko] undefined!ERROR: “inet_diag_register” [net/dccp/dccp_diag.ko] undefined!ERROR: “gre_del_protocol” [drivers/net/ppp/pptp.ko] undefined!ERROR: “gre_add_protocol” [drivers/net/ppp/pptp.ko] undefined!ERROR: “lro_flush_all” [drivers/net/ethernet/myricom/myri10ge/myri10ge.ko] undefined!ERROR: “lro_receive_frags” [drivers/net/ethernet/myricom/myri10ge/myri10ge.ko] undefined!ERROR: “lro_receive_skb” [drivers/infiniband/hw/nes/iw_nes.ko] undefined!ERROR: “lro_flush_all” [drivers/infiniband/hw/nes/iw_nes.ko] undefined!WARNING: modpost: Found 2 section mismatch(es).To see full details build your kernel with:’make CONFIG_DEBUG_SECTION_MISMATCH=y’make : *** [__modpost] Error 1make: *** [modules] Error 2和楼上的问题类似,但我已经是一个一个编译模块了。。。