操作系统之CPU架构

238 阅读4分钟

操作系统之CPU架构

1. CPU物理核

一个CPU处理器,一般有多个运行核心,把一个运行核心称为一个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(简称L1 cache),包括一级指令缓存(L1i cache)和一级数据缓存(L1d cache),一级私有的二级缓存(简称L2 cache)。

这里提到的物理核的私有缓存,其实是指缓存空间只能被当前的这个物理核使用,其他的物理核无法对这个核的缓存空间进行数据存取。以下是CPU物理核的架构。

image-20210512154431886.png

当数据或指令保存到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缓存的关系。

image-20210512155921640.png

2. 多CPU架构

在主流的服务器,一个CPU处理器会有10到20个物理核。同时为了提高服务器的处理能力,服务器通常还会有多个CPU处理器(也称为CPU Socket),每个处理器有自己的物理核(包括L1、L2缓存),L3缓存,以及连接的内存。同时不同处理器间通过总线连接。

下图为多CPU Socket的架构,图中有两个CPU Socket,每个Socket有两个物理核,通常,每个物理核内部有两个逻辑核。

image-20210512171453727.png

在 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 可以看到每个进程的上下文切换。