一、优化方法论
从软件层面提升硬件使用效率
-增大CPU的利用率 -增大内存的利用率 -增大磁盘10的利用率 -增大网络带宽的利用率
提升硬件规格
-网卡:万兆网卡,例如10G、25G、40G等 -磁盘:固态硬盘 -CPU :更快的主频,更多的核心,更大的缓存,更优的架构
二、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: worker processes number auto; Default: worker_processes 1; Context: main
为何一个CPU就可以同时运行多个进程?
- 宏观上并行,微观上串行
- 把进程的运行时间分为一段段的时间片
- OS调度系统依次选择每个进程,最多执行时间片指定的时长
- 阻塞API引发的时间片内主动让出CPU
-速度不一致引发的阻塞API
-硬件执行速度不一致,例如CPU和磁盘
- 业务场景产生的阻塞API
-例如同步读网络报文
2、尽可能减少进程间切换
-何为进程间切换
• 是指CPU从一个进程或线程切换到另一个进程或线程
• 类别
• 主动切换
• 被动切换:时间片耗尽
• Cost: <5us
- 减少主动切换
- 减少被动切换
• 增大进程优先级
2.1减少被动进程间切换的配置-设置worker进程优先级
增大worker进程的时间片,通过设置优先级赖减入被动切换
什么决定CPU时间片的大小?
在默认情况下,最小时间片是5ms,最大则有800ms
进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长
Nice静态优先级:-20 - 19 静态优先级越小越不友好则时间片越长,可以通过top程序看到
设置worker进程的静态优先级
Syntax: worker_priority number;
Default: worker_priority 0;
Context: main
2.2、减入被动进程间切换的配置-为进程绑定cpu
nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu
当CPU在运行的时候,如果一颗CPU始终固定的去运行同一个进程,当用户连接到进程的时候,用固定的CPU响应用户的请求,
CPU中有缓存,就可以重复的使 用CPU中缓存的数据。如果进程一开始运行在第一颗CPU上,运行一会跑到第二颗CPU上,就
意味着原来的缓存信息在第二颗CPU上无法使用,还需要重新加 载,带来资源的浪费,影响效率
绑定Nginx worker进程到指定的CPU内核
Syntax: worker_cpu_affinity cpumask
worker_cpu_affinity auto [cpumask];
Default: -;
Context: main
3、Nginx 事件处理模型优化
Nginx 的连接处理机制在不同的操作系统中会采用不同的 I/O 模型,在 linux 下,Nginx 使用 epoll 的 I/O 多路复用模型,在
Freebsd 中使用 kqueue 的 I/O 多 路复用模型 不过这个选项没必要设置,因为nginx会自动选择最有效的方法作为默认项
Syntax: use method;
Default: —
Context: events
4.单个进程允许的客户端最大连接数
通过调整控制连接数的参数来调整 Nginx 单个进程允许的客户端最大连接数,更多的worker的connection数量对会占用更多的内
存,一般一个connection约232字 节,而且event也约96字节,一个连接就是232+96*2
Syntax: worker_connections number;
Default: 1024
Context: events
5.配置Nginx worker进程最大打开文件数
Syntax: worker_rlimit_nofile number;
Default: —
Context: events
上面两个参数都受最大文件句柄数限制,当运行的服务需要大并发进程运行时,如果不够,就会报出“too many open files”
file-max是内核可分配的最大文件数可通过 cat /proc/sys/fs/file-max 查看
nr_open是单个进程可分配的最大文件数 可通过 cat /proc/sys/fs/nr_open 查看
但是也不是不可修改可通过编辑/proc/sys/fs/file-max 修改 echo 30296 > /proc/sys/fs/file-max 单个进程分配文件数如上操作
6.修改用户的最大文件句柄数限制
临时修改 ulimit -HSn limit
永久修改 vi /etc/security/limits.conf
-H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。
硬限制(hard limit)一旦被设置以后就不能被非root用户修改,软限制(soft limit)可以增长达到硬限制(hard limit)。
如果既没有指定-H选项也没有指定-S选项,那么硬限制(hard limit)和软限制(soft limit)都会被设置。
总结
a.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
b.单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
c.nofile的soft limit不能超过其hard limit
d. nofile的hard limit不能超过/proc/sys/fs/nr_open