优化方法论
(1)从软件层面提升硬件使用效率
①增大CPU的利用率
②增大内存的利用率
③增大磁盘IO的利用率
④增大网络带宽的利用率
(2)提升硬件规格
①网卡:万兆网卡,例如10G,25G,40G等
②磁盘:固态硬盘,关注IOPS和BPS指标
③CPU:更快的主频,更多的核心,更大的缓存,更优的架构
④内存:更快的访问速度
(3)超出硬件性能上限后使用DNS
如何增大nginx使用CPU的有效时长?
(1)能够使用全部CPU资源
①master-worker多进程架构
②worker进程数量应当大于等于CPU核数(master进程只是负责管理,worker进程为实际工作进程)
(2)Nginx进程间不做无用功浪费CPU资源
①worker进程不应在繁忙时,主动让出CPU(多个worker进程间不应由于争抢造成资源耗散。worker进程应当等于CPU核数)
②worker进程不应调用一些API导致主动让出CPU,拒绝类似的第三方模块
(3)不被其他进程争抢资源
①提升优先级占用CPU更长时间
②减少操作系统上耗资源的非Nginx进程
1.worker_processes 指令
语法:worker_processes number | auto(选用auto时,自动选择跟CPU核数相同)
默认:worker_processes 1;
放置位置:main
为何一个CPU就可以同时运行多个进程?
在宏观上并行,微观上串行
把进程的运行时间分为一段段的时间片,OS调度系统依次选择每个进程,最多执行时间片指定的时长
阻塞API引发的时间片内主动让出CPU
(1)速度不一致引发的阻塞API(硬件执行速度不一致,例如CPU和磁盘)
(2)业务场景产生的阻塞API(例如同步读网络报文)
减少进程间的切换(是指CPU从一个进程或线程切换到另一个进程或线程。花费5us)
(1)使nginx worker进程尽可能处于运行状态
(2)尽可能减少进程间切换(Linux命令: vstat,dstat, pidstat -w -p 进程号 1)
(3)绑定CPU
什么决定CPU时间片的大小?
(1)Nice静态优先级:-20 —— 19 (越小优先级越高,一般把nginx调到-20)
1.worker_priority指令(设置worker进程的静态优先级)
语法:worker_priority number;
默认:worker_priority 0;
放置位置:main
(2)Priority动态优先级:0——139
提升CPU缓存命中率:worker_cpu_affinity
1.worker_cpu_affinity指令(绑定worker到指定CPU)
语法:worker_cpu_affinity cpumask.......; worker_cpu_affinity auto(自动一个worker绑定一颗CPU)
默认:空
放置位置:main