如何有效的使用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架构:
查看三级缓存的大小:
查看三级缓存的命中率情况,可以看到下图中缓存的命中率很高