Nginx性能优化实战:实现10万并发关键!

Nginx是大型架构核心,下面详解Nginx并发性能@mikechen

worker_processes:并发的上限天花板

Nginx性能优化实战:实现10万并发关键!

worker_processes auto;   # 推荐写法,自动等于 CPU 核数
# 或者明确写:worker_processes  8;   # 假设服务器有 8 核

Nginx 是多进程 + 事件驱动模型,每个 worker 进程是独立的,能充分利用多核 CPU。

worker_processes = CPU 核数(或核数 × 1.5~2),能最大化 CPU 利用率。

设太少(如默认 1):CPU 利用率低,并发上不去。

设太多(如 32 核机器设 100):进程上下文切换开销暴增,反而性能下降。

一般建议:是设置为与 CPU 核心数相同,以充分利用多核并行处理能力。

但实际生产中需要结合负载性质:I/O 密集型(大量静态文件、上游慢响应)可适当增大进程数以覆盖阻塞时间。

CPU 密集型(复杂加密、压缩)则更应与核心数对齐或略小。

 

worker_connections + 多路复用模型:单进程能抗多少连接

Nginx性能优化实战:实现10万并发关键!

events {
    worker_connections  65535;          # 单个 worker 最大连接数
    multi_accept        on;             # 一次性接受多个连接
    use                 epoll;          # Linux 推荐(性能最好)
    # use kqueue;       # FreeBSD / macOS
}

其次,worker_connections 定义每个 worker 能同时处理的连接上限。

Nginx 使用事件驱动模型,单个进程通过高效的异步 I/O 管理大量连接,因此提升 worker_connections 可以线性扩大并发容量。

但该值受限于操作系统的文件描述符(FD)上限:总并发近似等于 worker_processes × worker_connections(减去一些内部连接)。

因此,必须同步调整 ulimit 与系统级 fd_limit,避免达到系统极限而导致拒绝新连接。

理论最大值:单个 worker_connections ≈ ulimit -n(系统最大打开文件数) / worker_processes

 

系统资源限制(ulimit + 内核参数)

Nginx 再牛,也逃不过系统资源限制,必须调的几个内核参数(/etc/sysctl.conf)。

Nginx性能优化实战:实现10万并发关键!

# 增大文件描述符上限
fs.file-max = 2097152
# 增大 TCP 连接 backlog
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
# 复用 TIME_WAIT 端口
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 增大连接数
net.ipv4.ip_local_port_range = 1024 65535
# 关闭 TCP slow start 重传优化
net.ipv4.tcp_slow_start_after_idle = 0

除了通过 ulimit 提升单进程 FD 上限外,需修改 /etc/security/limits.conf等参数。

并关注 TCP TIME_WAIT、keepalive_timeout 设置以控制连接生命周期,避免大量短连接耗尽 FD。

 

内存与网络 I/O优化

Nginx性能优化实战:实现10万并发关键!

处理海量静态资源或代理大流量时,系统的上下文切换次数决定了吞吐量。

Sendfile & TCP_NOPUSH:开启 sendfile 启用零拷贝技术。

# 开启 sendfile + tcp_nopush(零拷贝 + 优化网络包)
sendfile on;
tcp_nopush on;

数据直接在内核空间缓冲区传输,不经过用户空间。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧