优化shadowsocks Linux服务器

本文档通过 Linux提高文件并发数、开启高级算法hybla、调整内核参数3个手段来进行shadowsocks优化。

一、控制shell程序的资源,调优系统

1、ulimit命令调整

ulimit -a 用来显示当前的各种用户进程限制。

ulimit -n 命令可以查看Linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值。
ulimit -n xx 可以修改每个进程可打开的文件数,缺省值是1024。
例如下面通过命令将每个进程可以打开的文件数增加到4096:

1
ulimit -n 51200

unlimit -u xx 修改各linux用户的最大进程数。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况设置各linux用户的最大进程数。
例如通过命令把当前用户的最大进程数设置为 10000:

1
ulimit -u 4096

下面配置项建议设置为无限制(具体视情况而定):
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited

上面通过 ulimit 命令设置的项只能在当前登录shell的会话期间有效。

2、永久设置方法:

a、解除 Linux 系统的最大进程数和最大文件打开数限制

编辑 /etc/security/limits.conf,添加如下行:

1
2
3
4
* soft noproc 4096
* hard noproc 4096
* soft nofile 51200
* hard nofile 51200

说明:* 代表针对所有用户
noproc 代表最大进程数
nofile 代表最大文件打开数
重启生效。

b、将一个相应的 ulimit 语句添加到登录shell 时读取的文件中

修改所有 linux 用户的环境变量文件 /etc/profile,添加如下:

1
2
3
4
5
6
7
ulimit -n 51200
ulimit -u 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited

或修改当前用户配置文件 ~/.bash_profile,添加如下:

1
2
3
4
5
6
7
ulimit -n 51200
ulimit -u 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited

二、系统内核参数调优

通过修改 /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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需根据实际情况配置。
fs.file-max = 51200

# 内核套接字接受缓存区的最大大小
net.core.rmem_max = 67108864

# 内核套接字发送缓存区的最大大小
net.core.wmem_max = 67108864

# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 250000

# 已经成功建立连接的套接字将要进入队列的长度
net.core.somaxconn = 4096

# 该参数与性能无关,用于解决TCP的SYN攻击。
net.ipv4.tcp_syncookies = 1

# 开启重用。允许将TIME-WAIT的sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
net.ipv4.tcp_tw_reuse = 1

# 关闭timewait 快速回收
net.ipv4.tcp_tw_recycle = 0

# server端主动发起断开连接后,保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30

# 当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
net.ipv4.tcp_keepalive_time = 1200

# 允许系统打开的端口范围。
net.ipv4.ip_local_port_range = 10000 65000

# 表示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
net.ipv4.tcp_max_syn_backlog = 8192

# 表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
# 注:主动关闭连接的服务端会产生TIME_WAIT状态的连接
net.ipv4.tcp_max_tw_buckets = 5000

# 开启TCP Fast Open,内核版本至少为3.7.0
net.ipv4.tcp_fastopen = 3

# TCP使用内存使用的下限 警戒值 上限
net.ipv4.tcp_mem = 25600 51200 102400

# TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_rmem = 4096 87380 67108864

# TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 4096 65536 67108864

# 开启tcp层路径mtu发现
net.ipv4.tcp_mtu_probing = 1

# 正在使用的TCP拥塞控制算法设置为hybla
net.ipv4.tcp_congestion_control = hybla

修改完成后使用命令 sysctl -p 重新加载配置使生效。

三、优化效果

使用监控工具查看TCP连接数就可以看到优化效果。

官方说明:https://shadowsocks.org/en/config/advanced.html