阿狸先森|Nginx专题(3):nginx优化方法论

1、优化方法论从软件层面提升硬件使用效率
-增大CPU的利用率-增大内存的利用率-增大磁盘10的利用率-增大网络带宽的利用率提升硬件规格
-网卡:万兆网卡 , 例如10G、25G、40G等-磁盘:固态硬盘-CPU:更快的主频 , 更多的核心 , 更大的缓存,更优的架构-内存:更快的访问速度2、Nginx相关优化配置-进程相关1、如何增大Nginx使用CPU的有效时长
能够使用全部CPU资源
.master-worker多进程架构.worker进程数量应当大于等于CPU核数Nginx进程间不做无用功浪费CPU资源
.worker进程不应在繁忙时 , 主动让出CPU.worker进程间不应由于争抢造成资源耗散.worker进程数量应当等于CPU核数.worker进程不应调用一些API导致主动让出CPU.比如使用openresty调用第三方模块不被其他进程争抢资源
.提升优先级占用CPU更长的时间.减少操作系统上耗资源的非Nginx进程设置worker进程的数量通过合理的设置worker的进程数量 , 提高cpu利用率,cpu设置等于或者小于核数查看cpu核数的方法grep"processor"/proc/cpuinfo|wc-l
Syntax:workerprocessesnumberauto;Default:worker_processes1;Context:main为何一个CPU就可以同时运行多个进程?
-宏观上并行 , 微观上串行-把进程的运行时间分为一段段的时间片-OS调度系统依次选择每个进程 , 最多执行时间片指定的时长-阻塞API引发的时间片内主动让出CPU-速度不一致引发的阻塞API-硬件执行速度不一致 , 例如CPU和磁盘-业务场景产生的阻塞API-例如同步读网络报文2、减入进程间切换
-何为进程间切换?是指CPU从一个进程或线程切换到另一个进程或线程?类别?主动切换?被动切换:时间片耗尽?减少被动切换?增大进程优先级2.1、减入被动进程间切换的配置-设置worker进程优先级
增大worker进程的时间片 , 通过设置优先级赖减入被动切换1.什么决定CPU时间片的大小?在默认情况下 , 最小时间片是5ms , 最大则有800ms进程分配的CPU时间片大小也与优先级有关 , 优先级越高 , 时间片越长2.Nice静态优先级:-20-19静态优先级越小越不友好则时间片越长 , 可以通过top程序看到3.设置worker进程的静态优先级增大worker进程的时间片 , 通过设置优先级赖减入被动切换什么决定CPU时间片的大小?在默认情况下 , 最小时间片是5ms , 最大则有800ms进程分配的CPU时间片大小也与优先级有关 , 优先级越高 , 时间片越长Nice静态优先级:-20-19静态优先级越小越不友好则时间片越长 , 可以通过top程序看到设置worker进程的静态优先级2.2、减入被动进程间切换的配置-为进程绑定cpu
1.nginx默认是没有开启利用多核cpu的配置的 。 需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu
2.当CPU在运行的时候 , 如果一颗CPU始终固定的去运行同一个进程 , 当用户连接到进程的时候 , 用固定的CPU响应用户的请求 , CPU中有缓存 , 就可以重复的使用CPU中缓存的数据 。 如果进程一开始运行在第一颗CPU上 , 运行一会跑到第二颗CPU上 , 就意味着原来的缓存信息在第二颗CPU上无法使用 , 还需要重新加载 , 带来资源的浪费 , 影响效率
绑定Nginxworker进程到指定的CPU内核Syntax:worker_cpu_affinitycpumaskworker_cpu_affinityauto[cpumask];Default:-;Context:main3、Nginx事件处理模型优化
Nginx的连接处理机制在不同的操作系统中会采用不同的I/O模型 , 在linux下 , Nginx使用epoll的I/O多路复用模型 , 在Freebsd中使用kqueue的I/O多路复用模型不过这个选项没必要设置 , 因为nginx会自动选择最有效的方法作为默认项
Syntax:usemethod;Default:—Context:events4.单个进程允许的客户端最大连接数
通过调整控制连接数的参数来调整Nginx单个进程允许的客户端最大连接数,更多的worker的connection数量对会占用更多的内存 , 一般一个connection约232字节 , 而且event也约96字节 , 一个连接就是232+96*2