Nginx性能优化之cpu优化

  • Post author:
  • Post category:其他




如何有效的使用cpu?


1.如何增大Nginx使用cpu的有效时长?


能够使用全部cpu资源:master-worker多进程架构,woker进程数量应该大于等于cpu核数

Nginx进程间不做无用功浪费cpu资源:

worker进程不应在繁忙时,主动让出cpu资源(worker进程间不应由于争抢造成资源损耗,worker进程数应该等于cpu核数)

worker不应调用一些api导致主动让出cpu(例如一些第三方库会调用阻塞的方法,使worker进程进入阻塞)

不被其他进程争抢资源:1.提高优先级占用cpu更长时间 2.减少操作系统上耗资源的非nginx进程


设置worker进程的数量

Syntax: worker_processes number | auto;
Default: worker_processes 1; 
Context: main


尽量减少进程间的切换:


1.我们的worker进程尽可能的处于R状态

2.尽可能减少进程间切换:一次进程切换的时间<5us,应减少主动切换和被动切换(增大进程的优先级)

3.绑定cpu


延迟处理新连接


使用TCP_DEFER_ACCEPT延迟处理新连接

Syntax: listen address[:port] [deferred];
Default: listen *:80 | *:8000; 
Context: server

该选项用于优化TCP协议从建立连接到接受数据的过程中服务器端的开销。在一般的监听套接字中,当三次握手的完成之后,响应的链接就会放入到accept队列中,这时服务器调用accept就会得到一个已连接的套接字,但是这个套接字上也许没有可读的数据,服务器反而要等到数据的到来。而使用这个选项后,三次握手完成之后,这个链接并不能被accept到,而是要等到真正的数据到达的时候,才能被accept得到已连接的套接字nginx开启了TCP_DEFER_ACCEPT后,每accept到一个套接字,立刻就可以对这个套接字进行读操作,提高了效率。
在这里插入图片描述

查看进程上下文切换:pidstat -w


设置worker进程的静态优先级

worker_priority number



多核间的负载均衡

惊群效应:多进程(线程)同时阻塞等待同一事件的时候(休眠状态),如果等待的事件发生它就会唤醒等待的所有进程或线程,但是最终只有一个进程或线程获得这个事件的控制权,其他线程或进程只能重新进入休眠状态

在这里插入图片描述

default模式:它的accept_mutex是on,相当于在应用层建了一把锁来保证同一时间只有一个worker进程来处理新建立的连接

reuseport:在内核层面提供的一种负载均衡的机制

reuseport通过让所有worker进程均处于listen来实现,然后应用再做相应的负载均衡

在这里插入图片描述


提高cpu的缓存命中率


在这里插入图片描述

cpu的三级缓存是多核共享的,通过以下指令查看哪些核共享一个三级缓存
在这里插入图片描述
通过worker_cpu_affinty来进行绑定cpu来增加缓存的命中率

NUMA架构:
在这里插入图片描述

查看三级缓存的大小:
在这里插入图片描述

查看三级缓存的命中率情况,可以看到下图中缓存的命中率很高
在这里插入图片描述



版权声明:本文为Drftyytf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。