操作系统之CPU架构
1. CPU物理核
一个CPU处理器,一般有多个运行核心,把一个运行核心称为一个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(简称L1 cache),包括一级指令缓存(L1i cache)和一级数据缓存(L1d cache),一级私有的二级缓存(简称L2 cache)。
这里提到的物理核的私有缓存,其实是指缓存空间只能被当前的这个物理核使用,其他的物理核无法对这个核的缓存空间进行数据存取。以下是CPU物理核的架构。
当数据或指令保存到L1、L2缓存时,物理核访问他们的延迟不超过10纳秒,速度非常快。如果Redis把运行的指令或存取的数据保存在L1和L2缓存的话,就能高速访问这些指令和数据。但是L1、L2缓存的大小受限于处理器的制造技术,一般只有KB级别,存不了太多数据,如果L1、L2缓存中没有数据,应用程序就需要访问内存来获取数据。内存的访问延迟级别在百纳秒级别。是L1、L2缓存访问的10倍,不可避免会对性能产生影响。
因此,不同的物理核还会共享一个共同的三级缓存(简称L3 cache)。L3缓存使用的存储资源比较多,一般比较大,能达到几MB到几十MB。当L1、L2缓存中没有数据缓存时,可以访问L3,,尽可能避免访问内存。此外,现在主流的CPU处理器中,每个物理核通常会运行两个超线程,也叫作逻辑核。同一个物理核的逻辑核共享使用L1、L2缓存。 下图为物理核、逻辑核,以及L1、L2和L3缓存的关系。
2. 多CPU架构
在主流的服务器,一个CPU处理器会有10到20个物理核。同时为了提高服务器的处理能力,服务器通常还会有多个CPU处理器(也称为CPU Socket),每个处理器有自己的物理核(包括L1、L2缓存),L3缓存,以及连接的内存。同时不同处理器间通过总线连接。
下图为多CPU Socket的架构,图中有两个CPU Socket,每个Socket有两个物理核,通常,每个物理核内部有两个逻辑核。
在 CPU架构,应用程序可以在不同的处理器上运行。如上图,Redis可以先在Socket 1运行一段时间,然后再调度到Socket 2上运行。(注:CPU有天然的亲和性,通常进程不会再处理器之间频繁的迁移)。
如果应用程序先从Socket1上运行,并把数据保存到内存,然后调度到另一个Socket2上运行。此时应用程序再进行内存访问时,就需要访问之前Socket1上连接的内存。这种访问属于远端内存访问。和访问Socket直接的内存相比,远端内存访问会增加应用程序的延迟。
在多CPU架构下,一个应用程序访问所在Socket的本地内存和访问远端内存的延迟并不一致,把这个架构称为非同一内存访问架构(NUMA架构)。
3. lscpu命令
可以通过lscpu命令,了解CPU的架构是怎么样。
Architecture: x86_64 //架构
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2 //逻辑CPU个数
On-line CPU(s) list: 0,1
Thread(s) per core: 1 //每核超线程(逻辑核)数
Core(s) per socket: 2 //每个CPU(Socket)有几个物理核
Socket(s): 1 //CPU插槽数
NUMA node(s): 1
Vendor ID: GenuineIntel //CPU厂商id
CPU family: 6 //CPU序列
Model: 79 //型号
Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz //型号名称
Stepping: 1
CPU MHz: 2399.998 //CPU主频
BogoMIPS: 4799.99
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K //一级数据缓存大小
L1i cache: 32K //一级指令缓存大小
L2 cache: 256K //二级缓存大小
L3 cache: 35840K //三级缓存大小
NUMA node0 CPU(s): 0,1
Socket就是主板上插cpu的槽的数目,也就是可以插入的物理CPU的个数。
core就是我们平时说的“核“,每个物理CPU可以双核,四核等等。
thread就是每个core的硬件线程数,即超线程(或为逻辑核)。
CPU为逻辑CPU,其数量为 :Socket * Core * Thread。
如上面例子:逻辑CPU为2个,拥有1个Socket,每个Socker各2个Core,每个Core各1个Thread。CPU(s) = 1 * 2 * 1= 2
4. 参考资料
1) 为什么CPU结构也会影响Redis的性能?《Redis核心技术与实践》——极客时间
2)linux下把进程/线程绑定到特定cpu核上运行 blog.csdn.net/guotianqing…
3)lscpu命令详解 www.cnblogs.com/machangwei-…
通过vmstat 可以查看整个系统的上下文切换,通过pidstat -w 可以看到每个进程的上下文切换。