并发一高就出现连接被重置,错误日志提示连接数超出上限,服务本身并没有崩溃。
把日志和配置对完,能解释这个现象的基本就这几处。单个工作进程的连接数上限设得太小。也可能是工作进程数量与处理器核数不匹配。
少数情况下是开启了长连接,每个客户端占用多个连接。
动手时先看当前连接数统计
ss -s && ss -tn state established | wc -l
随后确认工作进程与连接上限
grep -E 'worker_processes|worker_connections' /etc/nginx/nginx.conf
再往下按核数和业务调整
nproc && ulimit -n
等前面都确认过,再重载后观察峰值
nginx -s reload && tail -f /var/log/nginx/error.log
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
恢复的判定其实很直接。峰值并发下不再出现连接被丢弃的日志,页面访问稳定。
容易忽略的是,总连接上限是进程数乘以单进程上限,但还受系统句柄上限约束,三处要一起看。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。