Pages

Monday, 28 March 2016

安装hybla模块,以优化tcp


前提:你的VPS为XEN/KVM架构。(openvz vps是不行的。)
首先我们要在系统中启用 TCP Fast Open

1
# echo 3 > /proc/sys/net/ipv4/tcp_fastopen
需要重启后也生效 TCP Fast Open ,要编辑 sysctl.conf

1
# echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
检查 TCP Fast Open 有没有生效运行

1
# sysctl net.ipv4.tcp_fastopen
得到 net.ipv4.tcp_fastopen = 3,表示已经成功生效了。
增加 TCP 连接数量

1
2
3
4
5
# cat >> /etc/security/limits.conf << EOF
soft nofile 51200
hard nofile 51200
EOF
# ulimit -n 51200
接着我们要调整 TCP 拥塞控制算法为 hybla,并且优化 TCP 参数
TCP 拥塞控制算法:
中美之间的线路质量不是很好,rtt 较长且时常丢包。TCP 的设计目的是解决不可靠线路上可靠传输的问题,即为了解决丢包,但丢包却使 TCP 传输速度大幅下降。HTTP 协议在传输层使用的是 TCP 协议,所以网页下载的速度就取决于 TCP 单线程下载的速度(因为网页就是单线程下载的)。丢包使得 TCP 传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是 TCP 拥塞控制算法。
Linux 内核中提供了若干套 TCP 拥塞控制算法,这些算法各自适用于不同的环境。
  • reno 是最基本的拥塞控制算法,也是 TCP 协议的实验原型。
  • bic 适用于 rtt 较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是 2.6.8 到 2.6.18 之间的 Linux 内核的默认算法。
  • cubic 是修改版的 bic,适用环境比 bic 广泛一点,它是 2.6.19 之后的 linux 内核的默认算法。
  • hybla 适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。

1
2
# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno
当前系统的 TCP 拥塞控制算法只能选择 cubic 或者 reno 算法,hybla 算法并没有启用,我们就要启用 hybla 算法。

1
2
3
# /sbin/modprobe tcp_hybla
# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno hybla
这时表明 hybla 已经可以使用了。
修改 sysctl.conf 文件,优化 TCP 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# cp /etc/sysctl.conf /etc/sysctl.bak
# cat >> /etc/sysctl.conf << EOF
fs.file-max = 51200
# 提高整个系统的文件限制
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 3240000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
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.ipv4.tcp_fastopen = 3
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control= hybla
EOF
使配置生效

1
# sysctl -p
至此,优化也完成了。你可以尽情使用。
搭建完成后进行速度测试,ping 值在 300 左右,但是 youtube 看 1080p 视频可以流畅观看,缓冲到底!
--------------------------
首先你需要一台XEN/KVM架构的VPS,我用的是Linode。为了方便,我直接使用root账号进行操作。

先检查你的系统有没有安装hybla拥塞控制算法模块,如果有的话就不用安装了。

sysctl net.ipv4.tcp_available_congestion_control | grep hybla

1.查看系统版本:

root@localhost:~# uname -a
Linux localhost 3.18.1-x86_64-linode50 #1 SMP Tue Jan 6 12:14:10 EST 2015 x86_64 x86_64 x86_64 GNU/Linux

2.下载内核
我的内核版本是3.18.1,然后去kernel.org下载系统对应的内核,之后下载并解压:

wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.18.10.tar.gz
tar zxvf linux*

3.安装编译器

#for Ubuntu/Debian
apt-get install -y build-essential libncurses5-dev

#for CentOS
yum install -y ncurses-devel make gcc bc

4、配置内核编译文件

cd linux*
zcat /proc/config.gz > .config

编辑.config,找到CONFIG_TCP_CONG_CUBIC=y,如下图


在下面添加一行CONFIG_TCP_CONG_HYBLA=y,并更改CONFIG_DEFAULT_TCP_CONG为hybla。

然后编译

make

这个会比较慢,我的linode用了大约20分钟

5.准备编译内核模块

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

然后复制下面的内容,注意要把下面的KDIR修改为你自己下载的内核的根目录

obj-m := tcp_hybla.o
KDIR := /root/download/linux-3.18.1
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

6.编译模块

cd /root/download/linux-3.18.1
make modules

7.测试模块

cd /root/download/linux-3.18.1/net/ipv4
insmod ./tcp_hybla.ko
sysctl net.ipv4.tcp_available_congestion_control

如果安装成功,会有显示:
net.ipv4.tcp_available_congestion_control = hybla cubic reno

优化tcp后,shadowsocks的连接速度大增。
-----------------------

编译Linux内核模块教程,以tcp_hybla为例

国情原因,中美线路有时掉包率会很高,导致网站访问速度慢,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

from http://www.fslk.net/?p=822

 相关帖子:http://briteming.blogspot.com/2015/05/linux-vps.html