Pages

Friday, 15 May 2015

优化您的linux vps以加速SHADOWSOCKS

你应该优化您的系统。本教程适用于所有shadowsocks服务器(Python和libev等)。

在Debian 7:

创建/etc/sysctl.d/local.conf包含以下内容:   
fs.file-MAX = 51200

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.netdev_max_backlog = 4096
net.core.somaxconn = 4096

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 = 4096
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

#低延迟的网络,使用立方,而不是
#net.ipv4.tcp_congestion_control =立方米


那么:
sysctl的--system

老的系统:
sysctl的-p /etc/sysctl.d/local.conf

警告:不要启用net.ipv4.tcp_tw_recycle!

如果使用supervisor,请确保您有以下行的/ etc /默认/主管。一旦你加入该行,重新启动主管(服务站主管&&服务启动监事)。
ulimit -n 51200

如果您在其他方面的背景shadowsocks,确保添加的ulimit -n 51200在你的初始化脚本。
优化后,繁忙的Shadowsocks服务器处理的连接成千上万,需要大约30MB的内存和10%的CPU。注意,在同一时间,Linux内核通常使用> 100MB的RAM来保存缓冲液和缓存这些连接。通过以上的sysctl配置,你权衡RAM的速度。如果你想使用较少的内存,降低rmem和wmem的大小。

from  https://github.com/shadowsocks/shadowsocks/wiki/Optimizing-Shadowsocks
-------------------------
 加速/优化SHADOWSOCKS

下面介绍几种简单的优化方法,也是比较推荐的几种,能够得到立竿见影的效果。

1. 内核参数优化
首先,将 Linux 内核升级到 3.5 或以上。

第一步,增加系统文件描述符的最大限数

编辑文件 limits.conf
vi /etc/security/limits.conf


增加以下两行   
* soft nofile 51200
* hard nofile 51200

启动shadowsocks服务器之前,设置以下参数:   
ulimit -n 51200

第二步,调整内核参数
修改配置文件 /etc/sysctl.conf:
   
fs.file-max = 51200

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096

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

修改后执行 sysctl -p 使配置生效.

2. 锐速
锐速是一款非常不错的TCP底层加速软件,可以非常方便快速地完成服务器网络的优化,配合 ShadowSocks 效果奇佳。目前锐速官方也出了永久免费版本,适用带宽20M、3000加速连接,个人使用是足够了。如果需要,先要在锐速官网注册个账户。

然后确定自己的内核是否在锐速的支持列表里,如果不在,请先更换内核,如果不确定,请使用 手动安装-http://my.serverspeeder.com/w.do?m=lslm

确定自己的内核版本在支持列表里,就可以使用以下命令快速安装了。   
wget http://my.serverspeeder.com/d/ls/serverSpeederInstaller.tar.gz
tar xzvf serverSpeederInstaller.tar.gz
bash serverSpeederInstaller.sh

输入在官网注册的账号密码进行安装,参数设置直接回车默认即可,
最后两项输入 y 开机自动启动锐速,y 立刻启动锐速。之后可以通过lsmod查看是否有appex模块在运行。

到这里还没结束,我们还要修改锐速的3个参数,vi /serverspeeder/etc/config
   
rsc="1" #RSC网卡驱动模式
advinacc="1" #流量方向加速 
maxmode="1" #最大传输模式

digitalocean vps的网卡支持rsc和gso高级算法,所以可以开启rsc="1",gso="1"。

重新启动锐速":   
service serverSpeeder restart

3. net-speeder
net-speeder 原理非常简单粗暴,就是发包翻倍,这会占用大量的国际出口带宽,本质是损人利己,不建议使用。

(1) Ubuntu/Debian 下安装依赖包:   
apt-get install libpcap0.8
apt-get install libnet1
apt-get install libnet1-dev
apt-get install libpcap0.8-dev

(2) Centos 下安装依赖包
需要配置 epel 第三方源。下载 epel :http://dl.fedoraproject.org/pub/epel/ 。例如,Centos 7 x64:   
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -ivh epel-release-7-5.noarch.rpm
yum repolist

然后安装依赖包:   
yum install libnet libpcap libnet-devel libpcap-devel

(3) 下载官方的 tar.gz 压缩包。解压安装运行:   
wget http://net-speeder.googlecode.com/files/net_speeder-v0.1.tar.gz
tar zxvf net_speeder-v0.1.tar.gz
cd net_speeder
chmod 777 *
sh build.sh -DCOOKED

首先你需要知道你的网卡设备名,可以使用 ifconfig 查看。假设是eth0,那么运行方法是:
./net_speeder eth0 "ip"

关闭 net-speeder:   
killall net_speeder

哦,对了,作者已经将 net-speeder 迁移到 GitHub了-https://github.com/snooda/net-speeder,感兴趣的可以关注。

以上3种方法是我用过的比较有效的加速方法。
----------------------


我们首先要了解搬瓦工不支持锐速、不支持TCP Fast Open、不支持hybla,加入hybla参数是为了其他服务器也能使用这篇文章的内容,其实那个参数对搬瓦工来说,然 并 卵。
作者本人使用的电信20M光纤宽带,国际网速比较坑爹,优化之后,非高峰时段,Shadowsocks可看720p,高峰时段标清不卡。以下是详细步骤:
搬瓦工可以一键安装Shadowsocks服务器端,这里不多说安装步骤了,网上很多地方也都有。
搬瓦工选择机房时,应尽量选择靠近美国西海岸的IP,离天朝近,速度上相对比较快。Los Angeles, California or Phoenix, Arizona
1. 调整搬瓦工Shadowsocks的加密方式
加密方式改为CR4-MD5,相对aes-256-cfb来说可能加密方式更弱,但加密速度是后者的好几倍,对于一般用户来说,没有影响但能提高速度。
服务器端口一定要使用默认的443端口(很重要),具体原因不多讲了,端口特性
默认是CENTOS环境,下面讲讲优化:
2.增加系统文件描述符的最大限数
编辑文件 limits.conf
vi /etc/security/limits.conf
增加以下两行
* soft nofile 51200
* hard nofile 51200
启动shadowsocks服务器之前,设置以下参数(这一步是Shadowsocks官文上讲的,但实际上上面两步就是执行下面这一步,所以,下面的参数可以跳过了)
ulimit -n 51200
3. 更新sysctl和modprobe ( 非openvz平台跳过这一步,openvz据说改内核参数然并卵,没有副作用,随手做一做吧,下面的也跟着改一改吧)
rm -f /sbin/sysctl
ln -s /bin/true /sbin/sysctl
rm -f /sbin/modprobe
ln -s /bin/true /sbin/modprobe
4. 修改配置文件 sysctl.conf
vi /etc/sysctl.conf
增加如下内容:
fs.file-max = 51200
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_congestion_control = hybla
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_rmem  = 32768 436600 873200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestsmps = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 9000
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_mem = 94500000 91500000 92700000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_wmem = 8192 436600 873200
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
执行生成
sysctl -p
5. 安装net-speeder
分别执行以下命令:
wget --no-check-certificate https://gist.github.com/LazyZhu/dc3f2f84c336a08fd6a5/raw/d8aa4bcf955409e28a262ccf52921a65fe49da99/net_speeder_lazyinstall.sh
sh net_speeder_lazyinstall.sh
加入开机启动:
echo ‘nohup /usr/local/net_speeder/net_speeder venet0 “ip” >/dev/null 2>&1 &’ >> /etc/rc.local
6. 重启VPS
reboot

ref:
http://blog.csdn.net/shaobingj126
net-speeder安装指南:https://code.google.com/p/net-speeder/
LazyZhu的懒人脚本: https://github.com/LazyZhu
-------------------------

TCP EVIL

TCP-EVIL Congestion control algorithm, based on very few modifications to tcp_hybla
This module is for Linux 3.2, Debian 7. Use apt-get source your kernel on Debian 7 to get the kernel source for the same kernel version.
Modifications are simple:
  1. in slow start phase, increase speed more quickly
  2. in congestion avoidance phase, increase speed more quickly
  3. when entering loss state, set ssthresh to 0.9 cwnd instead of 0.5 cwnd
This is a demostration of how easily we can increase TCP sending speed from the server side if you ignore fairness and friendliness.
from  https://github.com/clowwindy/tcp_evil
-----------------------------

shadowsocks optimize


1. 系统层面

基于kvm架构vps的优化
这方面SS给出了非常详尽的优化指南,主要有:优化内核参数,开启TCP Fast Open
####1.1优化内核参数 编辑vi /etc/sysctl.conf
复制进去
# max open files
fs.file-max = 1024000
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096

# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1

# for high-latency network
net.ipv4.tcp_congestion_control = hybla
# forward ipv4
net.ipv4.ip_forward = 1
保存生效
sysctl -p
其中最后的hybla是为高延迟网络(如美国,欧洲)准备的算法,需要内核支持,测试内核是否支持,在终端输入:
sysctl net.ipv4.tcp_available_congestion_control
如果结果中有hybla,则证明你的内核已开启hybla,如果没有hybla,可以用命令modprobe tcp_hybla开启。
对于低延迟的网络(如日本,香港等),可以使用htcp,可以非常显著的提高速度,首先使用modprobe tcp_htcp开启,再将net.ipv4.tcp_congestion_control = hybla改为net.ipv4.tcp_congestion_control = htcp,建议EC2日本用户使用这个算法。

1.2 TCP优化

1.修改文件句柄数限制
如果是ubuntu/centos均可修改/etc/sysctl.conf
找到fs.file-max这一行,修改其值为1024000,并保存退出。然后执行sysctl -p使其生效
修改vi /etc/security/limits.conf文件,加入
*               soft    nofile           512000
*               hard    nofile          1024000
针对centos,还需要修改vi /etc/pam.d/common-session文件,加入
session required pam_limits.so
2.修改vi /etc/profile文件,加入
ulimit -SHn 1024000
然后重启服务器执行ulimit -n,查询返回1024000即可。
sysctl.conf报错解决方法
修复modprobe的:
rm -f /sbin/modprobe 
ln -s /bin/true /sbin/modprobe
修复sysctl的:
rm -f /sbin/sysctl 
ln -s /bin/true /sbin/sysctl

1.3 锐速

锐速是TCP底层加速软件,官方已停止推出永久免费版本,但网上有破解版可以继续使用。需要购买的话先到锐速官网注册帐号,并确认内核版本是否支持锐速的版本。
一键安装速锐破解版
wget -N --no-check-certificate https://github.com/91yun/serverspeeder/raw/master/serverspeeder.sh && bash serverspeeder.sh
一键卸载
chattr -i /serverspeeder/etc/apx* && /serverspeeder/bin/serverSpeeder.sh uninstall -f
设置
Enter your accelerated interface(s) [eth0]: eth0
Enter your outbound bandwidth [1000000 kbps]: 1000000
Enter your inbound bandwidth [1000000 kbps]: 1000000
Configure shortRtt-bypass [0 ms]: 0
Auto load ServerSpeeder on linux start-up? [n]:y #是否开机自启
Run ServerSpeeder now? [y]:y #是否现在启动
执行lsmod,看到有appex0模块即说明锐速已正常安装并启动。
至此,安装就结束了,但还有后续配置。
修改vi /serverspeeder/etc/config文件的几个参数以使锐速更好的工作
accppp="1" #加速PPTP、L2TP V-P-N;设为1表示开启,设为0表示关闭
advinacc="1" #高级入向加速开关;设为 1 表示开启,设为 0 表示关闭;开启此功能可以得到更好的流入方向流量加速效果;
maxmode="1" #最大传输模式;设为 1 表示开启;设为 0 表示关闭;开启后会进一步提高加速效果,但是可能会降低有效数据率。
rsc="1" #网卡接收端合并开关;设为 1 表示开启,设为 0 表示关闭;在有些较新的网卡驱动中,带有 RSC 算法的,需要打开该功能。
l2wQLimit="512 4096" #从 LAN 到 WAN 加速引擎在缓冲池充满和空闲时分别能够缓存的数据包队列的长度的上限;该值设置的高会获得更好的加速效果,但是会消耗更多的内存
w2lQLimit="512 4096" #从 WAN 到 LAN 加速引擎在缓冲池充满和空闲时分别能够缓存的数据包队列的长度的上限;该值设置的高会获得更好的加速效果,但是会消耗更多的内存
重读配置以使配置生效/serverspeeder/bin/serverSpeeder.sh reload
查看锐速当前状态/serverspeeder/bin/serverSpeeder.sh stats
查看所有命令/serverspeeder/bin/serverSpeeder.sh help
停止/serverspeeder/bin/serverSpeeder.sh stop
启动/serverspeeder/bin/serverSpeeder.sh start
重启锐速/serverspeeder/bin/serverSpeeder.sh restart

1.4 开启TCP Fast Open

这个需要服务器和客户端都是Linux 3.7+的内核,一般Linux的服务器发行版只有debian jessie有3.7+的,客户端用Linux更是珍稀动物,所以这个不多说,如果你的服务器端和客户端都是Linux 3.7+的内核,那就在服务端和客户端的vi /etc/sysctl.conf文件中再加上一行。
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
然后把vi /etc/shadowsocks.json配置文件中"fast_open": false改为"fast_open": true。这样速度也将会有非常显著的提升。

2. 加密层面

####2.1 安装M2Crypto 这个可以提高SS的加密速度,安装办法:
Debian/Ubuntu
apt-get install python-m2crypto
安装之后重启SS,速度将会有一定的提升
CentOS
先安装依赖包:
yum install -y openssl-devel gcc swig python-devel autoconf libtool
安装setuptools:
wget --no-check-certificate https://raw.githubusercontent.com/iMeiji/shadowsocks_install/master/ez_setup.py
python ez_setup.py install
再通过pip安装M2Crypto:
pip install M2Crypto 或者pip install M2Crypto --upgrade

2.3 使用CHACHA20加密算法

首先,安装libsodium,让系统支持chacha20算法。
Debian/Ubuntu
apt-get install build-essential
wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
tar xf LATEST.tar.gz && cd libsodium*
./configure && make && make install
ldconfig
CentOS
yum groupinstall "Development Tools"
wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
tar zxf LATEST.tar.gz
cd libsodium* 
./configure
make
make install
vi /etc/ld.so.conf
添加一行:
/usr/local/lib
保存退出后,运行命令:
ldconfig
然后修改ss加密方式:
vi /etc/shadowsocks.json "method":"aes-256-cfb"改成"method":"chacha20",重启SS即可/etc/init.d/shadowsocks restart

3. 网络层面

此外,选择合适的端口也能优化梯子的速度,广大SS用户的实践经验表明,检查站(GFW)存在一种机制来降低自身的运算压力,即常用的协议端口(如http,smtp,ssh,https,ftp等)的检查较少,所以建议SS绑定这些常用的端口(如:21,22,25,80,443),速度也会有显著提升。
如果你还要给小伙伴爬,那我建议开启多个端口而不是共用,这样网络会更加顺畅。

3.1 防火墙设置(如有)

自动调整MTU
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
开启 NAT (记得把 eth0 改成自己的网卡名,openvz 的基本是 venet0 )
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
开启 IPv4 的转发
sysctl -w net.ipv4.ip_forward=1
打开 443 端口
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p udp --dport 443 -j ACCEPT
重启防火墙iptables:
service iptables restart

---------------------------

优化ss(我按本文做过)

  1. TCP Fast Open

    主要通过第一次 TCP 握手后服务器产生 Cookie 作为后续 TCP 连接的认证信息,客户端通过 TCP 再次连接到服务器时,可以在 SYN 报文携带数据 (RFC793),降低了握手频率,可避免恶意攻击并大幅降低网络延迟 (参考)。下面介绍如何开启这一功能

    1
    2
    3
    4
    echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
    # 运行以上命令,设置 IPv4 下的 TFO 默认为开启状态
    sysctl -e -p
    # 运行以上命令,应用配置
  2. 改善 TCP 拥塞算法

    HTTP 协议在传输层使用 TCP 协议,TCP 丢包重传机制算法的不同会大幅影响科学上网速度;更换 TCP 拥塞算法需要使用命令 vim /etc/sysctl.conf 编辑系统配置文件,并定位到 net.ipv4.tcp_congestion_control = 这一行 (若没有请手动添加),其后接的算法主要有 cubichyblabbr 等,修改完成后使用命令 sysctl -e -p 应用配置;下面是相关算法的简单介绍

    1
    2
    3
    cubic  # 由 bic 算法衍化而来,适用于低丢包率网络
    hybla # 卫星链路使用的算法,适用于高延迟,高丢包率的网络
    bbr # 由 Google 开源的算法,适用于低延迟,较低丢包率的网络 (需要手动配置*)

    *配置 Google BBR

    开始配置 BBR 之前,确保你的内核版本 > 4.8.x (使用命令 uname -a 查看),若低于最低版本,请先更新你的内核 (Ubuntu);若要更新内核,请先使用命令 vim updatekernel.sh 新建脚本,将下面的代码复制粘贴到脚本内并保存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    KERNELVER="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]./{print $2}' | cut -d/ -f1 | grep -v -  | sort -V | tail -1)"
    # 获取最新的 Linux Kernel 版本
    SYSTYPE="$(dpkg --print-architecture)"
    # 获取系统平台信息
    [ "$SYSTYPE" = "amd64" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    [ "$SYSTYPE" = "i386" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    [ "$SYSTYPE" = "armhf" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/armhf.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    [ "$SYSTYPE" = "arm64" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/arm64.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    [ "$SYSTYPE" = "ppc64el" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/ppc64el.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    [ "$SYSTYPE" = "s390x" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/s390x.deb/{print $2}' | cut -d'<' -f1 | head -1)"
    # 获取对应平台 Kernel 包的文件名
    wget -t 3 -T 30 -nv -O "$KERNEL" "http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/${KERNEL}"
    # 下载对应的 Kernel
    dpkg -i $KERNEL
    # 安装下载好的 Kernel
    rm -f $KERNEL
    # 清理下载文件
    update-grub
    # 更新启动菜单

    然后使用命令 chmod -x updatekernel.sh && bash updatekernel.sh 给予脚本运行权限并运行脚本来更新内核

    若无需更新内核,则先将拥塞控制算法填写为 bbr,再添加以下代码保存并使用命令 sysctl -e -p 应用

    1
    2
    net.core.default_qdisc = fq
    # 将网络拥塞队列算法设置为性能和延迟最佳的 fq_codel
  3. 内核优化

    使用命令 vim sysctl.conf 编辑并在末尾加入如下代码,对系统进程及内存分配进行优化,保存并使用命令 sysctl -e -p 应用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fs.file-max = 1024000
    # 系统所有进程一共可以打开的句柄数 (bytes)
    kernel.msgmnb = 65536
    # 进程通讯消息队列的最大字节数 (bytes)
    kernel.msgmax = 65536
    # 进程通讯消息队列单条数据最大的长度 (bytes)
    kernel.shmmax = 68719476736
    # 内核允许的最大共享内存大小 (bytes)
    kernel.shmall = 4294967296
    # 任意时间内系统可以使用的共享内存总量 (bytes)

    使用命令 vim /etc/security/limits.conf 编辑和写入如下代码,限制用户档案的体积大小,提高系统稳定性,完成后保存

    1
    2
    3
    4
    *                soft    nofile           512000
    # 用户档案警告体积大小 (bytes)
    * hard nofile 1024000
    # 用户档案最大体积大小 (bytes)
    TCP 的优化
    1. 涉及内核控制,TCP 包大小,TCP 转发,连接超时等优化,代码的简单释义已在其下方注明;使用命令 vim sysctl.conf 编辑并写入如下代码,保存并使用命令 sysctl -e -p 应用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      net.core.rmem_max = 12582912
      # 设置内核接收 Socket 的最大长度 (bytes)
      net.core.wmem_max = 12582912
      # 设置内核发送 Socket 的最大长度 (bytes)
      net.ipv4.tcp_rmem = 10240 87380 12582912
      # 设置 TCP Socket 接收长度的最小值,预留值,最大值 (bytes)
      net.ipv4.tcp_wmem = 10240 87380 12582912
      # 设置 TCP Socket 发送长度的最小值,预留值,最大值 (bytes)
      net.ipv4.ip_forward = 1
      # 开启所有网络设备的 IPv4 流量转发,用于支持 IPv4 的正常访问
      net.ipv4.tcp_syncookies = 1
      # 开启 SYN Cookie,用于防范 SYN 队列溢出后可能收到的攻击
      net.ipv4.tcp_tw_reuse = 1
      # 允许将等待中的 Socket 重新用于新的 TCP 连接,提高 TCP 性能
      net.ipv4.tcp_tw_recycle = 0
      # 禁止将等待中的 Socket 快速回收,提高 TCP 的稳定性
      net.ipv4.tcp_fin_timeout = 30
      # 设置客户端断开 Sockets 连接后 TCP 在 FIN 等待状态的实际 (s),保证性能
      net.ipv4.tcp_keepalive_time = 1200
      # 设置 TCP 发送 keepalive 数据包的频率,影响 TCP 链接保留时间 (s),保证性能
      net.ipv4.tcp_mtu_probing = 1
      # 开启 TCP 层的 MTU 主动探测,提高网络速度
      net.ipv4.conf.all.accept_source_route = 1
      net.ipv4.conf.default.accept_source_route = 1
      # 允许接收 IPv4 环境下带有路由信息的数据包,保证安全性
      net.ipv4.conf.all.accept_redirects = 0
      net.ipv4.conf.default.accept_redirects = 0
      # 拒绝接收来自 IPv4 的 ICMP 重定向消息,保证安全性
      net.ipv4.conf.all.send_redirects = 0
      net.ipv4.conf.default.send_redirects = 0
      net.ipv4.conf.lo.send_redirects = 0
      # 禁止发送在 IPv4 下的 ICMP 重定向消息,保证安全性
      net.ipv4.conf.all.rp_filter = 0
      net.ipv4.conf.default.rp_filter = 0
      net.ipv4.conf.lo.rp_filter = 0
      # 关闭反向路径回溯进行源地址验证 (RFC1812),提高性能
      net.ipv4.icmp_echo_ignore_broadcasts = 1
      # 忽略所有 ICMP ECHO 请求的广播,保证安全性
      net.ipv4.icmp_ignore_bogus_error_responses = 1
      # 忽略违背 RFC1122 标准的伪造广播帧,保证安全性
      net.ipv6.conf.all.accept_source_route = 1
      net.ipv6.conf.default.accept_source_route = 1
      # 允许接收 IPv6 环境下带有路由信息的数据包,保证安全性
      net.ipv6.conf.all.accept_redirects = 0
      net.ipv6.conf.default.accept_redirects = 0
      # 禁止接收来自 IPv6 下的 ICMPv6 重定向消息,保证安全性
      net.ipv6.conf.all.autoconf = 1
      # 开启自动设定本地连接地址,用于支持 IPv6 地址的正常分配
      net.ipv6.conf.all.forwarding = 1
      # 开启所有网络设备的 IPv6 流量转发,用于支持 IPv6 的正常访问 (我优化到这步)
    2. 使用 m2crypto 加速加解密 (Python 服务端)

      1
      2
      3
      4
      apt-get install build-essential python3-dev python-dev python-pip libssl-dev swig
      # 运行以上命令,安装支持库
      pip install m2crypto
      # 运行以上命令,安装 m2crypto
    3. 使用 Kcptun 加速 (会影响 TCP Fast Open 的正常工作,请自行取舍)

      1
      2
      echo "$(dpkg --print-architecture)"
      # 运行以上命令,查看 Linux 硬件版本

      这里获取最新的预编译版本 Kcptun (Go) 下载地址 (注意选择相应的 Linux 系统版本)

      1
      2
      3
      4
      5
      6
      wget [获取的下载地址]
      # 运行以上命令,下载预编译版本 Kcptun
      tar -zxvf [下载后的文件名]
      # 运行以上命令,解压预编译文件
      ./[解压后的文件名] -t "[服务器目标IPv4]:[Kcptun目标端口]" -l ":[Kcptun监听端口]"
      # 运行以上命令启动 Kcptun,具体配置请参考官方 README*

      *kcptun/README 官方文档.

------------------------------------------------

一键安装最新内核并开启 BBR 脚本


最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,最新的 4.11 版内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。
根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。

本脚本适用环境

系统支持:CentOS 6+,Debian 7+,Ubuntu 12+
虚拟技术:OpenVZ 以外的,比如 KVM、Xen、VMware 等
内存要求:≥128M
日期  :2018 年 12 月 14 日

关于本脚本

1、当脚本检测到 VPS 的虚拟方式为 OpenVZ 时,会提示错误,并自动退出安装。
2、脚本运行完重启发现开不了机的,打开 VPS 后台控制面板的 VNC, 开机卡在 grub 引导, 手动选择内核即可。
3、由于是使用最新版系统内核,最好请勿在生产环境安装,以免产生不可预测之后果。

使用方法

使用 root 用户登录,运行以下命令:

1
bash <(curl -s -L https://git.io/BBR)

安装完成后,脚本会提示需要重启 VPS,输入 y 并回车后重启。
重启完成后,进入 VPS,验证一下是否成功安装最新内核并开启 TCP BBR,输入以下命令:

1
uname -r

查看内核版本,含有 4.12 就表示 OK 了

1
sysctl net.ipv4.tcp_available_congestion_control

返回值一般为:
net.ipv4.tcp_available_congestion_control = bbr cubic reno
或者为:
net.ipv4.tcp_available_congestion_control = reno cubic bbr

1
sysctl net.ipv4.tcp_congestion_control

返回值一般为:
net.ipv4.tcp_congestion_control = bbr

1
sysctl net.core.default_qdisc

返回值一般为:
net.core.default_qdisc = fq

1
lsmod | grep bbr

返回值有 tcp_bbr 模块即说明bbr已启动。注意:并不是所有的 VPS 都会有此返回值,若没有也属正常。

CentOS 下最新版内核 headers 安装方法

本来打算在脚本里直接安装 kernel-ml-headers,但会出现和原版内核 headers 冲突的问题。因此在这里添加一个脚本执行完后,手动安装最新版内核 headers 之教程。
执行以下命令

1
yum --enablerepo=elrepo-kernel -y install kernel-ml-headers

根据 CentOS 版本的不同,此时一般会出现类似于以下的错误提示:

1
2
Error: kernel-ml-headers conflicts with kernel-headers-2.6.32-696.20.1.el6.x86_64
Error: kernel-ml-headers conflicts with kernel-headers-3.10.0-693.17.1.el7.x86_64

因此需要先卸载原版内核 headers ,然后再安装最新版内核 headers。执行命令:

1
yum remove kernel-headers

确认无误后,输入 y,回车开始卸载。注意,有时候这么操作还会卸载一些对内核 headers 依赖的安装包,比如 gcc、gcc-c++ 之类的。不过不要紧,我们可以在安装完最新版内核 headers 后再重新安装回来即可。
卸载完成后,再次执行上面给出的安装命令。

1
yum --enablerepo=elrepo-kernel -y install kernel-ml-headers

成功安装后,再把那些之前对内核 headers 依赖的安装包,比如 gcc、gcc-c++ 之类的再安装一次即可。

为什么要安装最新版内核 headers 呢?
这是因为 shadowsocks-libev 版有个 tcp fast open 功能,如果不安装的话,这个功能是无法开启的。

内核升级方法

如果是 CentOS 系统,执行如下命令即可升级内核:

1
yum -y install kernel-ml kernel-ml-devel

如果你还手动安装了新版内核 headers ,那么还需要以下命令来升级 headers :

1
yum -y install kernel-ml-headers

CentOS 6 的话,执行命令:

1
sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf

CentOS 7 的话,执行命令:

1
grub2-set-default 0

如果是 Debian / Ubuntu 系统,则需要手动下载最新版内核来安装升级。
这里下载最新版的内核 deb 安装包。
如果系统是 64 位,则下载 amd64 的 linux-image 中含有 generic 这个 deb 包;
如果系统是 32 位,则下载 i386 的 linux-image 中含有 generic 这个 deb 包;
安装的命令如下(以最新版的 64 位 4.12.4 举例而已,请替换为下载好的 deb 包):

1
dpkg -i linux-image-4.12.4-041204-generic_4.12.4-041204.201707271932_amd64.deb

安装完成后,再执行命令:

1
/usr/sbin/update-grub

最后,重启 VPS 即可。

特别说明

如果你使用的是 Google Cloud Platform(GCP)更换内核,有时会遇到重启后,整个磁盘变为只读的情况。只需执行以下命令即可恢复:

1
mount -o remount rw /