CPU 架构
{Back to Index}  

Table of Contents

1. L1/L2 缓存

gen_arch.jpg

Figure 1: CPU 物理核架构

L1 和 L2 缓存是每个物理核 私有的 ,当数据或指令保存在 L1,L2 缓存时,物理核访问它们的延迟 不超过 10 纳秒 ,速度非常快。

2. L3 缓存

L1 和 L2 缓存的大小受限于处理器的制造技术,一般只有 KB 级别,存不下太多的数据。如果 L1、L2 缓存中没有所需的数据,应用程序就需要访问内存来获取数据。而应用程序的访存延迟一般在 百纳秒 级别,是访问 L1、L2 缓存的延迟的近 10 倍,不可避免地会对性能造成影响。
所以,不同的物理核还会 共享 一个共同的三级缓存。L3 缓存能够使用的存储资源比较多,所以一般比较大, 能达到几 MB 到几十 MB ,这就能让应用程序缓存更多的数据。当 L1、L2 缓存中没有数据缓存时,可以访问 L3,尽可能避免访问内存。

3. 逻辑核

另外,主流的 CPU 处理器中,每个物理核通常都会运行两个 超线程 ,也叫作逻辑核。 同一个物理核的逻辑核会共享使用 L1、L2 缓存。

caches.jpg

Figure 2: 物理核和逻辑核,以及一级、二级缓存的关系

4. NUMA

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

socket.jpg

Figure 3: NUMA 架构

在多 CPU 架构上,应用程序可以在不同的处理器上运行。比如上图中应用程序可以先在 Socket 1 上运行一段时间,然后再被调度到 Socket 2 上运行。

如果应用程序先在一个 Socket 上运行,并且把数据保存到了内存,然后被调度到另一个 Socket 上运行,此时,应用程序再进行内存访问时,就需要访问之前 Socket 上连接的内存,这种访问属于 远端内存访问 。和访问 Socket 直接连接的内存相比, 远端内存访问会增加应用程序的延迟

在 NUMA 架构下,经常发生某一个节点内存不够,但其他节点内存充足的情况下,依旧使用到了 Swap ,进而导致软件性能急剧下降的例子。 这通常是因为 CPU Socket 对应的内存不够了,但它 可能不会去另一个节点申请内存 。(可以通过配置操作系统内存回收策略改变这种行为:本节点回收内存/其他节点申请内存/内存数据换到 Swap 的倾向程度)

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2020-12-19 Sat 17:02

Updated: 2022-03-12 Sat 18:42

Emacs 30.1 (Org mode 9.7.11)