nginx 性能优化的概述及在CPU资源方面的处理
nginx的性能优化的概述
软件层面的提升硬件的使用率
增大CPU的利用率
增大内存的利用率
增大磁盘IO利用率
增大网络带宽利用率
提升硬件规格
网卡:万兆网卡、例如10G、25G、40G等
磁盘:固态硬盘,关注IOPS和BPS指标
CPU:更快的主频,更多的核心,更大缓存,更优的架构
内存:更快的访问速度
超出硬件上限后使用DNS
如何增大Nginx使用CPU的有效时长
能够使用全部CPU资源
master-worker进程架构
worker进程数量应当大于等于CPU核数
nginx进程之间不做无用功浪费CPU资源
worker进程不应该在繁忙时,主动退出CPU
worker进程间不应由争抢造成资源消耗
worker 进程数量应当等于CPU核数
worker进程不应调一些API导致主动让出CPU
拒绝类似的第三方模块
不被其他进程争抢资源
提升worker进程的优先级占用CPU更长时间
减少操作系统上耗资源的非nginx进程
设置worker进程数量的指令
1 2 3 | Syntax: worker_processes number | auto; Default: worker_processes 1 ; 指定worker进程数量 Context: main |
为何一个CPU就可以同时运行多个进程
宏观上并行,微观上串行
把进程运行时间分为一段段的时间片
OS调度系统依次选择每个进程,最多执行时间片指定的时长
阻塞API引发的时间片内主动让出CPU
速度不一致引发的阻塞API
硬件执行速度不一致,例如CPU和磁盘
业务场景产生的阻塞API
例如同步读取网络报文
确保进程在运行态
R运行:正在运行或在运行队列中等待
S中断:休眠中,受阻,在等待某个条件的形成或接受到信号
D不可中断:收到信号不换醒和不可运行,进程必须等待直到有中断发生
Z僵死:进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放
T停止:进程收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU 信号后停止
减少进程间的切换
nginx worker进程尽可能的处于R状态
R状态的进程数量大于CPU核心时,负载急速增高
1 2 3 4 5 6 7 | [root@python ~] # uptime 10 : 51 : 14 up 17 : 22 , 1 user, load average: 0.00 , 0.01 , 0.05 top top - 10 : 50 : 43 up 17 : 22 , 1 user, load average: 0.00 , 0.01 , 0.05 Tasks: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie |
尽可能减少进程间切换
何为进程间切换
是指CPU从一个进程或者线程切换到另一个进程或者线程
类别:主动切换 被动切换
Cost < 5us 进程切换代价,5微妙
减少主动切换
减少被动切换
增大进程优先级
绑定CPU
延迟处理新连接
使用TCP_DEFER_ACCEPT 延迟处理新连接
指令
1 2 3 4 | listen address[:port] [deferred]; Default: listen * : 80 | * : 8000 ; Context: server Syntax: |
如何查看上下文切换次数vmstat
1 2 3 4 | [root@python ~] # vmstat procs - - - - - - - - - - - memory - - - - - - - - - - - - - swap - - - - - - - io - - - - - system - - - - - - - - cpu - - - - - r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 1229020 2108 481792 0 0 2 2 17 18 0 0 100 0 0 |
dstat查看进程上下文切换
1 2 3 4 5 6 7 8 9 10 11 | [root@python ~] # dstat You did not select any stats, using - cdngy by default. - - - - total - cpu - usage - - - - - dsk / total - - net / total - - - - paging - - - - - system - - usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 100 0 0 0 | 4898B 5452B | 0 0 | 0 0 | 34 37 0 0 100 0 0 0 | 0 12k | 60B 826B | 0 0 | 56 79 0 0 100 0 0 0 | 0 0 | 60B 346B | 0 0 | 38 57 0 0 100 0 0 0 | 0 0 | 60B 346B | 0 0 | 42 58 0 1 99 0 0 0 | 0 0 | 60B 346B | 0 0 | 55 65 0 0 100 0 0 0 | 0 0 | 60B 346B | 0 0 | 52 71 0 0 100 0 0 0 | 0 4096B | 60B 346B | 0 0 | 42 61 |
针对进程查看
1 2 3 4 5 6 7 | [root@python ~] # pidstat -w -p 30170 1 Linux 3.10 . 0 - 957.el7 .x86_64 (python) 2019 年 07 月 19 日 _x86_64_ ( 2 CPU) 主动切换 被动切换 11 时 33 分 15 秒 UID PID cswch / s nvcswch / s Command 11 时 33 分 16 秒 997 30170 0.00 0.00 nginx 11 时 33 分 17 秒 997 30170 0.00 0.00 nginx 11 时 33 分 18 秒 997 30170 0.00 0.00 nginx |
控制CPU时间的片大小
1 2 3 4 5 6 7 8 9 | [root@python ~] # top top - 11 : 49 : 18 up 18 : 20 , 1 user, load average: 0.00 , 0.01 , 0.05 Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie % Cpu(s): 0.0 us, 5.6 sy, 0.0 ni, 94.4 id , 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1863252 total, 1198048 free, 174916 used, 490288 buff / cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1481828 avail Mem 动态 静态 PID USER PR NI VIRT RES SHR S % CPU % MEM TIME + COMMAND 30186 root 20 0 162020 2192 1548 R 5.6 0.1 0 : 00.03 top |
设置work进程静态优先级指令
1 2 3 | Syntax: worker_priority number; Default: worker_priority 0 ; 默认是零,设置优先级最高的话调到 - 20 Context: main |
worker进程间的负载均衡
如何打开此功能
1 | listen指令后加reuseport |
CPU缓存命中率;worker进程绑定到CPU指令
1 2 3 | Syntax: worker_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask]; Default: — Context: main |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏