Nginx作为接入层扛住高并发流量,默认配置远没有发挥其能力。单机几万QPS的压测目标下,worker进程数、连接池、缓冲区三块参数必须按硬件规格重新计算,内核的网络参数也要同步放开。压测达不到预期时,瓶颈往往不在Nginx本身,而在文件描述符上限、TIME_WAIT堆积或后端连接池耗尽,逐层排查才能定位真实短板。
worker进程与CPU亲和性配置
worker_processes决定进程数,auto模式按CPU核数自动分配,物理机或独占型云主机直接用auto。worker_cpu_affinity把每个worker绑定到固定核心,减少上下文切换带来的缓存失效,16核机器的配置:
worker_processes auto;
worker_cpu_affinity auto;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
worker_connections是单个worker的最大连接数,总并发=worker数×worker_connections。反向代理场景下一个客户端连接对应一个到后端的连接,实际承载的客户端并发是总数的一半,规划容量时按50%折算。epoll是Linux下的标准选择,multi_accept开启后worker一次epoll_wait尽量多收事件,突发流量下减少系统调用次数。
文件描述符与内核参数放开
worker_connections超过1024后,文件描述符上限是第一个撞上的墙。Nginx启动用户的nofile要同步调大:
# /etc/security/limits.conf
nginx soft nofile 1048576
nginx hard nofile 1048576
# /etc/sysctl.conf 高并发必备四项
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535
# sysctl -p 生效后验证
$ ss -s
TCP: estab 8432, closed 1024, orphaned 0, timewait 3721
作为反向代理,Nginx到后端的每个连接占一个本地端口,ip_local_port_range放大后单机可维护的代理连接数才能上去。压测时观察报错信息可判断瓶颈位置:502伴随后端accept队列溢出是somaxconn不够;connection refused说明后端进程没跟上;timeout增长但无报错多数是后端处理慢,先查应用层。
keepalive与缓冲区参数优化
客户端keepalive_timeout默认75秒过长,长连接挂着不释放会占用连接槽位,移动端场景10到15秒足够。到后端的连接必须开keepalive,否则每个请求都新建TCP,三次握手加TIME_WAIT会拖垮单机:
http {
keepalive_timeout 15s;
upstream backend {
server 10.0.1.11:8080 max_fails=3 fail_timeout=10s;
keepalive 128; # 每个worker的空闲连接池大小
keepalive_requests 1000;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 3s;
proxy_read_timeout 30s;
proxy_buffering on;
}
}
}
keepalive 128表示每个worker维持128个空闲后端连接,配合proxy_set_header Connection “”清空客户端传来的Connection头,复用才能真正生效。压测验证方法:压测期间ss -tn查看Nginx到后端的ESTABLISHED数量,若始终等于QPS对应的瞬时新建数,说明连接没复用,检查http版本是否是1.1,proxy默认用1.0不支持keepalive。
wrk压测验证与瓶颈定位
配置生效与否用wrk实测,4线程模拟并发连接,持续60秒:
$ wrk -t4 -c2000 -d60s --latency http://10.0.1.10:80/
Running 60s test @ http://10.0.1.10:80/
4 threads and 2000 connections
Latency 99ms (p99 = 241ms)
1294021 requests in 60s, 8GB read
Requests/sec: 21567
Non-2xx or 3xx responses: 0
21567 QPS且错误为0,说明接入层达标。压测中同步在Nginx机器上抓证据:vmstat 1看cs列,上下文切换超过每秒50万说明worker数或CPU绑定配置有问题;mpstat -P ALL的%soft列单核打满说明软中断集中,配合irqbalance或网卡多队列把中断分散到各核。后端机器单独压测一遍取基线,接入层压测结果除以后端基线,比值低于0.7时先扩后端,Nginx继续加参数收益有限。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-gao-bing-fa-pei-zhi-shi-zhan-worker-jin-cheng-diao/