参考:https://www.phpmianshi.com/?id=110
概述:
高并发场景下 too many open files 问题。可以通过设置系统打开文件数,直接影响单个进程容纳的客户端连接数。比如会影响到长链接应用如聊天中单个进程能够维持的用户连接数, 运行ulimit -n能 看到这个参数值,如果是1024,就是代表单个进程只能同时最多只能维持1024甚至更少(因为有其它文件的句柄被打开)。如果开启4个进程维持用户链 接,那么整个应用能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4x1024个用户在线可以增大这个设置以便服务能够维持更多的 TCP连接。
问题排查:
可以通过查看系统日志
cat /var/log/messages
解决方式:
vim /etc/security/limits.conf root soft nofile 100000 root hard nofile 100000
运行 sysctl -p即可生效
ulimit -n 查看
/etc/sysctl.conf参数详解 #表示进程(例如一个worker进程)可能同时打开的最大句柄数,直接限制最大并发连接数 fs.file max = 999999 #1代表允许将状态为TIME-WAIT状态的socket连接重新用于新的连接。对于服务器来说有意义,因为有大量的TIME-WAIT状态的连接 net.ipv4.tcp_tw_reuse = 1 #当keepalive启用时,TCP发送keepalive消息的频率。默认是2个小时。将其调小一些,可以更快的清除无用的连接 net.ipv4.tcp_keepalive_time = 600 #当服务器主动关闭链接时,socket保持FN-WAIT-2状态的最大时间 net.ipv4.tcp_fin_timeout = 30 #允许TIME-WAIT套接字数量的最大值。超过些数字,TIME-WAIT套接字将立刻被清除同时打印警告信息。默认是180000,过多的TIME-WAIT套接字会使webserver变慢 net.ipv4.tcp_max_tw_buckets = 5000 #UDP和TCP连接中本地端口(不包括连接的远端)的取值范围 net.ipv4.ip_local_port_range = 1024 61000 #TCP接收/发送缓存的最小值、默认值、最大值 net.ipv4.tcp_rmem = 4096 32768 262142 net.ipv4.tcp_wmem = 4096 32768 262142 #当网卡接收的数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数就是这个队列的最大值。 net.core.netdev_max_backlog = 8096 #内核套接字接收/发送缓存区的默认值 net.core.rmem_default = 262144 net.core.wmem_default = 262144 #内核套接字接收/发送缓存区的最大值 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 #解决TCP的SYN攻击。与性能无关 net.ipv4.tcp_syncookies = 1 #三次握手建立阶段SYN请求队列的最大长度,默认是1024。设置大一些可以在繁忙时将来不及处理的请求放入队列,而不至于丢失客户端的请求 net.ipv4.tcp_max_syn_backlog = 1024 #以下可能需要加载ip_conntrack模块 modprobe ip_conntrack #缩短established的超时时间 net.netfilter.nf_conntrack_tcp_timeout_established = 180 #CONNTRACK_MAX 允许的最大跟踪连接条目,是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目) net.netfilter.nf_conntrack_max = 1048576 net.nf_conntrack_max = 1048576