一、问题描述
-
应用程序通过
Nginx
反向代理后存在访问异常的情况 -
查看当前连接数,用户访问的高峰期才出现该类异常问题
-
查看
Nginx
错误日志[alert] 3137#3137: *446352 10240 worker_connections are not enough while connecting to upstream, udp client: 3.3.3.3, server: 0.0.0.0:9000, upstream: "1.1.1.2:9997", bytes from/to client:0/0, bytes from/to upstream:0/0
二、问题分析
-
从错误日志和报错环境来看,由于流量的高峰期通过
Nginx
服务来访问后端应用报错提示Nginx
工作连接数不足 -
查询官网资料了解到
Nginx
的连接数由如下三个参数决定worker_processes worker_connections worker_rlimit_nofile
-
根据官网资料调整如上两个参数即可解决该问题
三、解决方案
-
设置
worker_processes
工作进程数设置规则:设置为 CPU 的总核数(CPU总核数 = 物理CPU个数 *️ 每颗物理CPU的核数 )
P.S
# 查看物理 CPU 个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理 CPU 的核数 cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看逻辑 CPU 的个数 cat /proc/cpuinfo| grep "processor"| wc -l # 查看 CPU 的信息 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看内存信息 cat /proc/meminfo
-
设置
worker_connections
工作连接数该参数表示每个进程允许的最多连接数,默认值为 10240 。
理论上每台 Nginx 服务器的最大连接数为 worker_process * worker_connections 即(CPU总核数 * 10240) -
设置
worker_rlimit_nofile
打开文件最大句柄数该参数表示 Nginx 一个进程打开的最多文件数目,理论值为:ulimit -n / worker_processes
但是 Nginx 分配请求并不是那么均匀,所以一般与 ulimit -n 的值保持一致