前提:你的VPS为XEN/KVM架构。(openvz vps是不行的。)
首先我们要在系统中启用 TCP Fast Open
1
| # echo 3 > /proc/sys/net/ipv4/tcp_fastopen
|
sysctl.conf
1
| # echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
|
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 拥塞控制算法:
中美之间的线路质量不是很好,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 |
1 2 3 | # /sbin/modprobe tcp_hybla # sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = cubic reno 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