是指CPU从一个进程或线程切换到另外一个进程或者线程,类别分为主动切换和被动切换:
STAT字段:
惊群问题:一个网络请求报文进来,激活了所有work进程,然后只有一个work进程处理了这个请求报文,其他进程则进入sleep状态,从而造成了浪费。
由于当时的linux内核处理很有问题,nginx实现了accept_mutex处理惊群问题。早期默认开启accept_mutex on,目前默认关闭 accept_mutex off。linux内核3.9以上采用reuseport处理大大提升了效率。
经测试得出以下数据:
吞吐量由小到大:accept_mutex on<accept_mutex off<reuseport
时延由长到短:accept_mutex off<accept_mutex on<reuseport
处理的波动情况由大到小,越大有些用户体验就很差:accept_mutex on<accept_mutex off<reuseport
可以看出reuseport全面的优于前面的方案,linux3.9以上、centos7以上可以打开reuseport大大提升性能。
reuseport是怎么做到的呢?它是在kernel层面上实际所有的worker都处于listener
处理网络报文分为硬中断和软中断
不是说把RSS、RPS、RFS都打开,性能就能得到提升。而是在做性能优化的时候,可以考虑这一点,根据场景进行配置优化性能。
每个CPU都有L1、L2、L3的多级缓存,一个程序的运行都是从内存->L3>L2>L1>cpu0。其中L3、L2、L1上有缓存信息,如果一个处理过程因为CPU的切换,导致程序在不同的CPU上执行往往浪费了之前在多级缓存中的信息(速度比没有缓存要慢点)。
查看L1、L2、L3缓存大小
查看多级缓存与哪个CPU核心共享的空间,奇数之间共享,偶数之间共享。下面因为云主机只有2核,所以只有一个
随着CPU核数增多16核、32核、内存总线就这么一个,这么多核心并发访问的时候就受限了。NUMA怎把内存和CPU核心分成两部分,比如8核CPU64G的分成2个32G总线分别给CPU0-3、CPU4-7使用。
NUMA节点概念:
列举系统上的NUMA节点
查看NUMA状态
numa_hit—命中的,也就是为这个节点成功分配本地内存访问的内存大小
numa_miss—把内存访问分配到另一个node节点的内存大小,这个值和另一个node的numa_foreign相对应。
numa_foreign–另一个Node访问我的内存大小,与对方node的numa_miss相对应
local_node----这个节点的进程成功在这个节点上分配内存访问的大小
other_node----这个节点的进程 在其它节点上分配的内存访问大小
很明显,miss值和foreign值越高,就要考虑绑定的问题。比如配置:禁止访问远程节点