一个CPU处理器中一般有多个运行核心,我们把一个运行核心称为一个物理核,每个物理核都可以运行应用程序。
每个物理核都拥有私有的一级缓存(Level 1 cache,简称L1 cache),包括一级指令缓存和一级数据缓存,以及私有的二级缓存(Level 2 cache,简称L2 cache)。
这里提到了一个概念,就是物理核的私有缓存。它其实是指缓存空间只能被当前的这个物理核使用,其他的物理核无法对这个核的缓存空间进行数据存取。
我们来看一下CPU物理核的架构。
d74f8805aa80edafdbc0ffe36fdb6b90_c2d620c012a82e825570df631a7fbc3a.jpg
因为L1和L2缓存是每个物理核私有的,所以,当数据或指令保存在L1、L2缓存时,物理核访问它们的延迟不超过10纳秒,速度非常快。那么,如果Redis把要运行的指令或存取的数据保存在L1和L2缓存的话,就能高速地访问这些指令和数据。
但是,这些L1和L2缓存的大小受限于处理器的制造技术,一般只有KB级别,存不下太多的数据。如果L1、L2缓存中没有所需的数据,应用程序就需要访问内存来获取数据。而应用程序的访存延迟一般在百纳秒级别,是访问L1、L2缓存的延迟的近10倍,不可避免地会对性能造成影响。
所以,不同的物理核还会共享一个共同的三级缓存(Level 3 cache,简称为L3 cache)。L3缓存能够使用的存储资源比较多,所以一般比较大,能达到几MB到几十MB,这就能让应用程序缓存更多的数据。当L1、L2缓存中没有数据缓存时,可以访问L3,尽可能避免访问内存。
另外,现在主流的CPU处理器中,每个物理核通常都会运行两个超线程,也叫作逻辑核。同一个物理核的逻辑核会共享使用L1、L2缓存。
为了方便你理解,我用一张图展示一下物理核和逻辑核,以及一级、二级缓存的关系。
1b901c425984c93f520cc45695b81df2_d9689a38cbe67c3008d8ba99663c2f09.jpg在主流的服务器上,一个CPU处理器会有10到20多个物理核。同时,为了提升服务器的处理能力,服务器上通常还会有多个CPU处理器(也称为多CPU Socket),每个处理器有自己的物理核(包括L1、L2缓存),L3缓存,以及连接的内存,同时,不同处理器间通过总线连接。
下图显示的就是多CPU Socket的架构,图中有两个Socket,每个Socket有两个物理核。
7a3a56efe314ff3af4281359ee5d78e6_5ceb2ab6f61c064284c8f8811431bc3d.jpg在多CPU架构上,应用程序可以在不同的处理器上运行。
如在刚才的图中,Redis可以先在Socket 1上运行一段时间,然后再被调度到Socket 2上运行。
但是,有个地方需要你注意一下:如果应用程序先在一个Socket上运行,并且把数据保存到了内存,然后被调度到另一个Socket上运行,此时,应用程序再进行内存访问时,就需要访问之前Socket上连接的内存,这种访问属于远端内存访问。和访问Socket直接连接的内存相比,远端内存访问会增加应用程序的延迟。
在多CPU架构下,一个应用程序访问所在Socket的本地内存和访问远端内存的延迟并不一致,所以,我们也把这个架构称为非统一内存访问架构(Non-Uniform Memory Access,NUMA架构)。
到这里,我们就知道了主流的CPU多核架构和多CPU架构,我们来简单总结下CPU架构对应用程序运行的影响。
- L1、L2缓存中的指令和数据的访问速度很快,所以,充分利用L1、L2缓存,可以有效缩短应用程序的执行时间;
- 在NUMA架构下,如果应用程序从一个Socket上调度到另一个Socket上,就可能会出现远端内存访问的情况,这会直接增加应用程序的执行时间。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 42 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Vendor ID: GenuineIntel
Model name: Intel(R) Xeon(R) Gold 6278C CPU @ 2.60GHz
CPU family: 6
Model: 85
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Stepping: 7
BogoMIPS: 5200.00
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmu
lqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust b
mi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni md_clear flush_l1d arch_capabilities
Virtualization features:
Hypervisor vendor: KVM
Virtualization type: full
Caches (sum of all):
L1d: 128 KiB (4 instances)
L1i: 128 KiB (4 instances)
L2: 4 MiB (4 instances)
L3: 35.8 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-7
Vulnerabilities:
Itlb multihit: KVM: Mitigation: VMX unsupported
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
Srbds: Not affected
Tsx async abort: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
该输出提供了有关Linux系统上的CPU架构和配置的详细信息,包括:
- Architecture: x86_64:系统架构是x86_64,这意味着它是64位系统。
- CPU op-mode(s): 32-bit, 64-bit:处理器支持32位和64位操作模式。
- Address sizes: 42 bits physical, 48 bits virtual:物理地址大小是42位,虚拟地址大小是48位。
- Byte Order: Little Endian:系统的字节顺序是小端序。
- CPU(s): 8:系统有8个CPU核心可用。
- On-line CPU(s) list: 0-7:所有8个CPU核心都在线并可用。
- Vendor ID: GenuineIntel:CPU制造商是英特尔。
- Model name: Intel(R) Xeon(R) Gold 6278C CPU @ 2.60GHz:CPU型号是Intel Xeon Gold 6278C,时钟频率是2.60GHz。
- CPU family: 6:CPU家族是6。
- Model: 85:CPU型号是85。
- Thread(s) per core: 2:每个CPU核心支持2个线程。
- Core(s) per socket: 4:每个CPU插槽支持4个核心。
- Socket(s): 1:系统只有一个CPU插槽。
- Stepping: 7:CPU步进是7。
- BogoMIPS: 5200.00:BogoMIPS是一个基准测试指标,该系统的BogoMIPS值为5200.00。
- Flags: 系统支持的CPU特性和指令集,包括FPU、SSE、AVX等。
- Virtualization features: 系统支持的虚拟化特性,包括Hypervisor vendor和Virtualization type。
- Caches: 系统的缓存配置,包括L1d、L1i、L2、L3缓存的大小和实例数。
- NUMA: 系统的NUMA配置,包括NUMA节点数和每个节点的CPU核心范围。
- Vulnerabilities: 系统的漏洞和安全性特性,包括Itlb multihit、L1tf、Mds、Meltdown、Spec store bypass、Spectre v1、Spectre v2、Srbds和Tsx async abort。输出还提供了有关如何缓解这些漏洞的信息。
网友评论