在大并发的服务器上, 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.somaxconn2个配置值.
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
使用配置生效:
leo@Redis:/etc$ sudo sysctl -p
- 调高部署服务的 listen backlog 值.