Nginx内核参数优化:如何提升10倍性能!

Nginx是大型架构核心,下面我详解Nginx优化@mikechen

进程与连接优化

worker_connections & worker_processes,这两个参数直接决定了 Nginx 能支撑的最大并发连接数。

Nginx内核参数优化:如何提升10倍性能!-mikechen

# Nginx 配置文件 (nginx.conf)
worker_processes  auto; # 自动匹配CPU核心数
worker_cpu_affinity auto; # 开启CPU亲和性绑定,避免进程上下文切换

events {
    worker_connections 65535; # 单个 worker 进程允许的最大连接数
    use epoll;                # 显式指定使用 epoll 事件模型
    multi_accept on;          # 收到新连接通知后,尽可能多地接受连接
}

光改 Nginx 没用,必须同步修改 Linux 系统的文件句柄限制。


# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350

 

网络全连接优化

在高并发请求瞬间涌入时,如果内核队列满了,客户端就会收到拒绝服务或超时错误,这是决定网络吞吐量的“咽喉”。

Nginx内核参数优化:如何提升10倍性能!-mikechen

# /etc/sysctl.conf
# 提升系统全局的 listen 队列最大长度
net.core.somaxconn = 65535
# 提高半连接队列长度,防范 SYN Flood 攻击并应对突发流量
net.ipv4.tcp_max_syn_backlog = 65535

同时在 Nginx 的 listen 指令中必须显式指定 backlog(默认值通常只有 511):

Nginx

server {
    listen 80 backlog=65535;
}

 

零拷贝与缓冲区优化
处理静态资源(如图片、JS/CSS、大文件)时的绝对神器,能够实现吞吐量的指数级提升。

Nginx内核参数优化:如何提升10倍性能!-mikechen

sendfile (Zero-Copy):传统文件传输需要经过:磁盘 -> 内核缓冲区 -> 用户缓冲区 -> Socket 缓冲区 -> 网卡

开启 sendfile 后,数据直接在内核态完成 磁盘 -> 内核缓冲区 -> 网卡 的传输,跳过了用户态的内存复制,CPU 利用率直线下降。

http {
    sendfile            on;   # 开启高效文件传输模式(零拷贝)
    tcp_nopush          on;   # 激活 TCP_CORK 选项,包裹数据包后再发送
    tcp_nodelay         on;   # 禁用 Nagle 算法,提高实时响应性

    # 保持连接超时时间
    keepalive_timeout   65;
}

 

tcp_nopushtcp_nodelay 组合拳

sendfile 开启时,tcp_nopush on 会让 Nginx 尽可能攒满一个完整的 TCP 包再发送,避免频繁的碎片包对带宽的浪费。

Nginx内核参数优化:如何提升10倍性能!-mikechen

tcp_nodelay on 则确保在最后的响应阶段,即使数据不满一个包也立即发送,降低延迟。

Nginx 内部对这两个看似矛盾的参数做了完美的兼容和动态平衡。

评论交流
    说说你的看法