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: 2021-08-17 Tue 11:23

Emacs 27.1 (Org mode 9.3)