V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
interdev
V2EX  ›  Linux

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

  •  1
     
  •   interdev · 2014-05-28 23:41:04 +08:00 · 30237 次点击
    这是一个创建于 3824 天前的主题,其中的信息可能已经有所发展或是发生改变。
    国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,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 ) ...
    第 1 条附言  ·  2015-03-17 22:50:54 +08:00
    Linode 又开始搞促销了,点击以下链接注册新用户,可以送20$。

    https://www.linode.com/?r=96fa2f404c25f017c4a1835f4d4453694cdbfc7e
    45 条回复    2015-10-25 18:23:42 +08:00
    XXOO
        1
    XXOO  
       2014-05-28 23:45:49 +08:00
    不错。感谢。ubuntu14可以用么?
    AstroProfundis
        2
    AstroProfundis  
       2014-05-28 23:46:01 +08:00
    Mark

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



    一大堆收藏通知...
    只收藏不回复,小心回家打屁股 :)
    XXOO
        6
    XXOO  
       2014-05-29 00:31:03 +08:00
    @interdev 哈哈。谢谢。看懂了。
    XXOO
        7
    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
        8
    interdev  
    OP
       2014-05-29 01:00:55 +08:00
    sysctl net.ipv4.tcp_congestion_control 显示 hybla 就成功了。
    Nin
        9
    Nin  
       2014-05-29 01:06:12 +08:00 via Android
    其实官方文档有篇pvgrub的文章,照着那样做加一句话就行了
    davidyin
        10
    davidyin  
       2014-05-29 01:06:46 +08:00
    这算是黑科技diy么?
    interdev
        11
    interdev  
    OP
       2014-05-29 01:09:12 +08:00
    @Nin 在哪,求请URL
    infong
        12
    infong  
       2014-05-29 01:15:00 +08:00 via Android
    马克,回头试试。。。
    XXOO
        13
    XXOO  
       2014-05-29 03:49:16 +08:00
    我测试了:开启前5m/s,开启后200k/s 看youtube。。。。楼下补充
    marklrh
        14
    marklrh  
       2014-05-29 06:06:26 +08:00
    @XXOO 惨...开启前5MB/S? 啥ISP啊
    rhwood
        15
    rhwood  
       2014-05-29 09:09:27 +08:00
    @Nin 官方文档重新编译ubuntu14.04有点问题的。比如默认压根没装grub,menu.lst照文档写也不对。
    @interdev 改成hybla有多大改善,我改了没什么作用,已经放弃
    zjgood
        16
    zjgood  
       2014-05-29 09:33:18 +08:00 via Android
    正需要,感谢
    pfipdaniel
        17
    pfipdaniel  
       2014-05-29 09:59:06 +08:00
    涨姿势了,第一次知道还有这样的模块,看来是我孤陋寡闻了,回去在自己的DO上试试,看看效果怎么样,话说现在DO上用ss连360p都看不了,郁闷的很。。。
    Nin
        18
    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
        19
    mikj  
       2014-05-29 10:05:10 +08:00
    32个赞给楼主
    interdev
        20
    interdev  
    OP
       2014-05-29 10:06:46 +08:00   ❤️ 1
    @pfipdaniel DO不用编译,我do上的ubuntu官方内核自带了,用 sysctl net.ipv4.tcp_congestion_control=hybla 加载即可。
    XXOO
        21
    XXOO  
       2014-05-29 10:15:31 +08:00
    @marklrh 电信
    ooxxcc
        22
    ooxxcc  
       2014-05-29 11:28:34 +08:00
    ubuntu直接用官方内核就有hybla,不需要自己编译。。。。

    就是不要用linode提供的内核,用ubuntu提供的
    XXOO
        23
    XXOO  
       2014-05-29 13:00:58 +08:00
    @ooxxcc Linode 官方这么使用官方的内核,谢谢。
    niseter
        24
    niseter  
       2014-05-29 23:41:05 +08:00 via Android
    马克
    ooxxcc
        25
    ooxxcc  
       2014-06-14 14:24:01 +08:00
    @XXOO 我是说,ubuntu发行版带的内核有hybla,https://library.linode.com/custom-instances/pv-grub-howto
    xuyuanp
        26
    xuyuanp  
       2014-06-23 12:17:30 +08:00
    请问,archlinux没有hybla模块怎么搞,谢谢
    TrickLin
        27
    TrickLin  
       2014-07-13 13:19:44 +08:00   ❤️ 1
    请教...在Ubuntu14.04下编译hybla...执行到第八步报错
    root@localhost:/lib/modules/3.12.9-x86_64-linode37# 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

    什么情况...
    interdev
        28
    interdev  
    OP
       2014-07-13 19:15:26 +08:00
    @TrickLin /lib/modules/3.12.9-x86_64-linode37


    目录不对,应该用自己的内核,不是3.12.9
    TrickLin
        29
    TrickLin  
       2014-07-14 09:24:17 +08:00
    @interdev 我用的就是3.12.9的内核...
    wwwap
        30
    wwwap  
       2014-08-03 09:36:32 +08:00
    @TrickLin
    Same here.
    quericy
        31
    quericy  
       2014-12-01 13:07:13 +08:00
    @interdev 我这也是 No such file or directory
    用uname -r对着的版本号进的目录啊,求解~(Linode Ubuntu 14.04.1 LTS )

    @wwwap @TrickLin 你们解决了吗?
    lguan
        32
    lguan  
       2014-12-12 14:02:41 +08:00
    @TrickLin
    @wwwap
    @quericy

    这个问题我也碰到了,我就到那个目录里面

    ```
    touch modules.order
    touch modules.builtin
    ```

    弄了两个空文件,然后就没警告信息,就过去了
    magicdog20
        33
    magicdog20  
       2014-12-14 02:09:54 +08:00
    我用的debian,在/etc/modules文件中加入一行tcp_hybla,开机就可以自动载入
    20015jjw
        34
    20015jjw  
       2014-12-26 21:22:07 +08:00
    @lguan 我开机还是无法自动加载。在测试模块的时候一切正常,touch之后depmod -a也执行而没有报错,但是reboot之后输入sysctl net.ipv4.tcp_available_congestion_control依然还是不显示,需要手动加载,很奇怪。我的sysctl.conf似乎也没用。如果能解答就好了,谢谢。
    xings
        35
    xings  
       2015-02-10 14:40:56 +08:00
    @quericy 你们这个问题解决了吗?
    quericy
        36
    quericy  
       2015-02-11 00:19:38 +08:00
    @xings 木~~~~貌似也没什么影响
    jaleo
        37
    jaleo  
       2015-02-16 22:20:44 +08:00
    我测试了,vultr的centos 7系统,默认是支持hybla算法的。启用后发现youtube 4K的速度慢了很多,关闭后正常,粗略地来回测试了几次,最后决定删除net.ipv4.tcp_congestion_control = hybla这句话。到底什么原因不清楚,或许我单位的网络比较好,本身到vultr节点的质量已经够好了。
    pH
        38
    pH  
       2015-05-01 09:02:45 +08:00
    @jaleo ping一下大概多少,ttl呢?Vultr哪个节点?
    jaleo
        39
    jaleo  
       2015-05-05 09:48:06 +08:00
    @pH time=86ms TTL=45 东京的节点
    pH
        40
    pH  
       2015-05-05 10:51:41 +08:00
    @jaleo 延迟确实比较好。我发现我的也是用hybla性能反而降了。
    604542720
        41
    604542720  
       2015-06-20 19:22:09 +08:00
    @jaleo 谁说vultr centos 7 支持hybla的。。。net.ipv4.tcp_available_congestion_control = cubic reno
    ljl024
        42
    ljl024  
       2015-06-21 11:48:12 +08:00
    成功了,谢谢
    Domokira
        43
    Domokira  
       2015-10-15 15:54:41 +08:00
    大神求助啊,现在用 4.1.5 的最新内核,到 make 再生成编译模块需要的内核报错了,
    kernel/Makefile:135: *** No X.509 certificates found ***
    这是什么原因呢?要怎么解决?
    fly3949
        44
    fly3949  
       2015-10-25 18:08:52 +08:00
    同楼上。。 kernel/Makefile:135: *** No X.509 certificates found ***
    fly3949
        45
    fly3949  
       2015-10-25 18:23:42 +08:00
    @Domokira 已找到原因。需要在$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 这行前面加一个 TAB 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2484 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:57 · PVG 23:57 · LAX 07:57 · JFK 10:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.