在大并发的服务器上, Linux 的网络部分内核参数有必要进行调优已得到最优化的性能.
比较关键的参数指标
/proc/sys/fs/file-max
: 整个系统最大可以打开的文件描述符数量. 文件描述符打开的最大数量也决定了服务器的最大连接数./proc/sys/net/ipv4/tcp_max_syn_backlog
: 指定TCP连接创建过程中, 已经完成第一次握手但是未完成第三次握手的队列长度. 意味着允许客户端和服务器端 同时 进行三次握手的队列长度. 这个就是 TCP 的Syn
队列(待完成连接队列). 如果这个队列已经满了. 服务器就不能再接受请求了.
已经完成三次握手的连接会放入另外一个队列进进行维护, 也就是和
Syn
队列对应的Accept
队列(已完成连接队列), 这个队列长度通常由backlog
参数控制. 但是系统也参考SOMAXCONN
值, 取他们2个的最小值为Accept
队列长度.
/proc/sys/net/ipv4/tcp_syncookies
: 如果为了扩大并发, 一味的把tcp_max_syn_backlog
值调大, 容易受到syn flood攻击
. 新版的 Kernel 有些改变, 设置tcp_syncookies
=1
后, 系统会默认tcp_max_syn_backlog
无限大./proc/sys/net/core/somaxconn
: TCPAccept
队列的长度的默认参考值, 如果要支持大并发, 这个值要调高. 能同时完成握手和服务器建立连接的队列长度越大, 那么表示同时的并发值越大.ulimit
: Linux 通常默认的每个用户的最大进程数和文件数为1024. 大并发优化必调参数.
优化操作
- 修改系统
ulimit
限制:
修改/etc/security/limits.conf
文件, 添加下面几行:
# 最大文件打开数
* soft nofile 32768
* hard nofile 65535
重启生效
- 修改系统
SOMAXCONN
+tcp_syncookies
:
修改/etc/sysctl.conf
文件, 修改net.ipv4.tcp_syncookies
和net.core.somaxconn
2个配置值.
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
使用配置生效:
leo@Redis:/etc$ sudo sysctl -p
- 调高部署服务的 listen backlog 值.