前言

优化 Shadowsocks server 的前提条件是内核版本在 3.5 以上,可通过uname -ir查看当前内核版本,如果版本过低,需要升级。

以下我的 VPS 内核版本升级的简单步骤:

VPS : Digitalocean and Linode
系统版本: CentOS 7 64bit

更新内核

查看当前内核版本信息

1
2
uname -ir
3.10.0-123.8.1.el7.x86_64 x86_64

Digitalocean 关于 Kernels 的更新操作可参考这里

更新并安装最新版本

1
2
3
4
yum update
yum list --showduplicates kernel # 列出可用的 kernel 版本
--------------------------------
yum install kernel-*(3.10.0-229.el7)* # 安装所需版本

验证安装及列出服务器上所有已安装的 kernels:

1
2
cd /boot
ls vmlinuz*

记住版本信息,进入 Digitalocean 控制面板 ,修改想要使用的内核版本。

Poweroff then poweron.

Optimize the shadowsocks server

增加 TCP 连接数量

1
2
echo '* soft nofile 51200
* hard nofile 51200' >> /etc/security/limits.conf

编辑 /etc/sysctl.conf 文件,优化 TCP 参数

1
vi /etc/sysctl.conf

加入以下内容:

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
# max open files
fs.file-max = 51200
# 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
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# 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

刷新配置文件使之生效:

1
sysctl --system

修改服务器中 shadowsocks 的 json 文件以开启 fast open:

1
fast_open: true

SSH 到路由器,进行如下操作:

1
echo 3 > /proc/sys/net/ipv4/tcp_fastopen

参考链接:


更新 

2016-1-12: 不要启用 net.ipv4.tcp_tw_reuse ,上文的配置文件已修正.具体原因可参考:

2017-2-14: 修改sysctl.conf配置文件

编译并启用 hybla 模块

检查系统可用算法

1
sysctl net.ipv4.tcp_available_congestion_control

Linode 没有自带,所以需要编译

检查 vps 内核版本

1
2
uname -r
4.8.6-x86_64-linode78

下载对应版本的内核源码

https://www.kernel.org/pub/linux/kernel/v4.x/ 查找并下载对应版本的tar.gz 文件

1
2
3
4
mkdir /root/kernel
cd /root/kernel
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.6.tar.gz
tar xvf linux-4.8.6.tar.gz

安装编译工具

1
2
yum -y groupinstall "Development Tools"
yum -y install ncurses-devel ncurses

编辑配置文件

1
2
3
cd linux-4.8.6
zcat /proc/config.gz > .config
vi .config

查找CONFIG_TCP_CONG_CUBIC=y,在其下面增加一行CONFIG_TCP_CONG_HYBLA=y
开始编译

1
make

等待内核编译完成,单核编译约15分钟。

编译模块

1
2
3
cd net/ipv4/
mv Makefile Makefile.old
vi Makefile

加入以下内容,KDIR 后面修改为你的源码路径。

1
2
3
4
5
6
# Makefile for tcp_hybla.ko
obj-m := tcp_hybla.o
KDIR := /root/kernel/linux-4.8.6
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

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

1
2
cd /root/kernel/linux-4.8.6/
make modules

等待编译完成。

测试加载模块

1
2
3
4
cd /root/kernel/linux-4.8.6/net/ipv4
cp tcp_hybla.ko /root/kernel/
cd /root/kernel
insmod tcp_hybla.ko

如果加载成功,则执行命令显示如下

1
2
sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno hybla # 输出结果后面多了一个 hybla

设置开机自动加载模块

tcp_hybla.ko 拷贝到 /lib/modules/4.8.6-x86_64-linode78/kernel/net/ipv4目录

1
2
3
4
5
6
cd /lib/modules/4.8.6-x86_64-linode78/
mkdir -p kernel/net/ipv4
cd kernel/net/ipv4
cp /root/kernel/tcp_hybla.ko .
cd /lib/modules/4.8.6-x86_64-linode78/
depmod -a

如果出现如下文件不存在的警告,可以通过创建对应的空白文件来解决。

1
2
depmod: WARNING: could not open /lib/modules/4.8.6-x86_64-linode78/modules.order: No such file or directory
depmod: WARNING: could not open /lib/modules/4.8.6-x86_64-linode78/modules.builtin: No such file or directory

解决办法

1
2
touch modules.order
touch modules.builtin

再重新执行depmod -a命令即可。

设置 hybla 优先加载

1
vi /etc/sysctl.conf

加入以下内容

1
2
# for high-latency network
net.ipv4.tcp_congestion_control=hybla