一、nginx的主配置优化
1.设置进程静态优先级
(1)如果进程在CPU的时间片较长,那么它的执行优先级更高;
(2)进程的静态优先级NICE值(-20~19)越小,优先级越高。
top,可以查看所有进程的静态优先级;
top -u nginx,可以查看nginx的静态优先级;
nginx.conf:
worker_priority -20;
2.设置worker进程数
多核CPU,进程的数量一般大于CPU核心数,但是在nginx的体系中,worker进程是用来处理用户请求的进程,避免多个worker进程争抢一颗CPU,所以最好设置成<=CPU核心数。
lscpu,查看CPU信息
nginx.conf:
worker_processes auto|自定义值;
3.CPU绑定提供缓存命中率
将worker进程与CPU核心进行绑定,以便更好地利用CPU的多级缓存。
现在的CPU一般会有三级缓存,一级L1缓存速度最好,二级L2次之,三级L3最慢;
其中L1与L2为单插槽上单核CPU独享,L3则是单插槽上多核CPU共享。
根据2.worker_processes设置的绑定CPU核心数
nginx.conf:
#绑定四核CPU的4个CPU:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#绑定八核CPU的2个CPU:
worker_processes 2;
worker_cpu_affinity 00000001 00000010;
#两个worker进程绑定4核CPU的4个CPU:
#第一个worker进程被绑定到CPU0/CPU2;
#第二个worker进程被绑定到CPU1/CPU3;
worker_processes 2;
worker_cpu_affinity 0101 1010;
4.worker进程间的负载均衡
accept_mutex参数:如果启用,该参数表示多个worker进程间顺序接收新连接,关闭 的话则会让所有worker进程同时被唤醒,但只有一个worker进程 能接收处理该请求。
nginx.conf:
accept_mutex: off;
5.单个worker进程允许同时打开的连接数(高并发核心)
通过配置worker_connections来修改单个worker进程可以同时打开的连接数,默认是512,需要调大该值,但不能超过worker_rlimit_nofile。
connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
1.内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
2.进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
设置ulimits:ulimit -SHn 65535
nginx.conf:
worker_connections 512;
6.所有worker进程允许同时打开的文件数(高并发核心)
一般worker_rlimit_nofile表示所有worker进程可以打开的文件句柄数,该值默认值未设置,将会受到系统级,用户级限制(注意:nginx worker进程的默认用户是nginx)。
nginx.conf:
worker_rlimit_nofile 自定义值;
7.使用epoll事件模型