Nginx优化总结
优化思路
Nginx处理请求大体可以分成下面两个阶段,两个阶段的优化都可以结合系统层面和应用层面。
- 请求(socket连接)
- 响应(文件)
请求
应用层面
- worker_connections,每个worker进程可以连接的客户端数量,内存充足的情况下,可以调到1W以上。
- worker_processes 用来设置Nginx 服务的进程数,一般设置为CPU的倍数。
- worker_cpu_affinity 绑定每个进程到指定的CPU核心,充分利用多核。
系统层面
- somaxconn 全连接队列长度,Accept queue大小为 min(somaxconn【内核层】, backlog【应用层】),位于 /proc/sys/net/core/somaxconn,可以修改成2048,不过调太大可能会导致处理时间过长,上游服务器超时.
- tcp_tw_reuse 将处于TIME_WAIT状态(持续超过1秒)的socket用于新的TCP连接,需同时开启TCP时间戳的支持,即net.ipv4.tcp_timestamps=1(默认即为1)。
- tcp_syncookies SYN等待队列溢出时,启用cookies来处理,新的连接不再用半连接队列处理。
响应
应用层面
- worker_rlimit_nofile 配置进程能打开的文件描述符,可以往高配置。
- sendfile 零拷贝的实现,参数传入文件和socket描述符,先通过DMA将磁盘数据拷贝到内核文件缓冲区,再把文件缓冲区的【描述符】和数据长度拷贝到socket缓冲区,全程由DMA参与,无需通过CPU。
系统层面
- ulimit -n 每个进程可以打开的文件描述符数量,这个参数配置大点也没问题,可以直接配置成100W。