如果在你的日志中看到很多 error: too many open files
,这时就应该优化你的系统了。
本教程适用于所有 Shadowsocks 服务端 (Python 版、libev 版、还有其他)
以下教程适用于 Debian7 系统:
新建 /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
然后运行:
sysctl --system
注意:不要开启 net.ipv4.tcp_tw_recycle
!!!看这个文章。
如果你在使用 Supervisor 的话,请确保 /etc/default/supervisor
文件中有下面这一行。添加这一行之后,请重启 Supervisor(service supervisor stop && service supervisor start
)
ulimit -n 51200
如果您通过其他方式来启动 Shadowsocks,确保 ulimit -n 51200
在您的启动脚本中。
优化后,一个繁忙的处理很多连接数的 Shadowsocks 服务器,会占用大约 30MB 的内存以及 10% 的 CPU。要注意的是同时,Linux 内核使用了 >100MB 内存来存储这些连接的缓存。用了上面提供的 sysctl 设置后,你是在用内存空间换取速度。如果你想用更少内存的话,减少 rmem 以及 wmem。
使用前 & 使用后: