2. Linux CPU 架构基础:NUMA 与 SMP 架构、CPU 缓存层级(L1/L2/L3)、超线程(Hyper-Threading)原理

在深入 containerd 的 CPU 管理策略与绑核调优之前,必须理解底层硬件架构。现代服务器 CPU 已不再是简单的单核处理器,而是由多核、多缓存层级、多内存控制器构成的复杂系统。本章将拆解三个核心概念:SMP/NUMA 内存架构、CPU 缓存层级以及超线程技术,这些直接决定了容器绑核策略的有效性。

2.1 SMP 与 NUMA:内存访问架构的演进

对称多处理(SMP)与非统一内存访问(NUMA)描述了 CPU 核心访问物理内存的方式。在容器绑核场景中,NUMA 架构是导致跨片访存延迟增加的根本原因。

特性 SMP(对称多处理) NUMA(非统一内存访问)
内存访问方式 所有 CPU 核心通过共享总线访问同一块物理内存 每个 CPU 插槽(Node)拥有本地内存,可访问远端内存
延迟特征 所有内存访问延迟一致(UMA) 本地内存延迟低,远端内存延迟高(通常高 1.3~2 倍)
扩展性 总线带宽瓶颈,核心数增多时性能下降 可扩展至数百核心,无总线争用
容器绑核影响 绑核主要影响缓存亲和性 绑核必须考虑 Node 本地性,否则产生跨片访问
调优要点:在 NUMA 架构下,containerd 的 CPU 管理器如果只绑核而不考虑 NUMA 节点,容器可能被调度到跨 Node 的核心上,导致内存访问延迟增加 30%~50%。使用 numactl --hardware 查看当前系统的 NUMA 拓扑。
NUMA 与 SMP 架构对比 SMP 架构(UMA) CPU Core 0 CPU Core 1 CPU Core 2 CPU Core 3 共享内存 (统一延迟) NUMA 架构 Node 0 Core 0-3 + 本地内存 Node 1 Core 4-7 + 本地内存 Node 2 Core 8-11 + 本地内存 远端内存 (高延迟) 说明:SMP 所有核心共享内存总线,延迟一致但扩展受限;NUMA 每个 Node 拥有本地内存,跨 Node 访问需经过互联总线,延迟显著增加。 容器绑核时,应优先将容器内存和 CPU 分配在同一 NUMA Node 内。

2.2 CPU 缓存层级:L1/L2/L3 与数据局部性

CPU 缓存是解决内存访问速度瓶颈的关键硬件。L1、L2、L3 三级缓存构成了金字塔结构,越靠近核心的缓存速度越快、容量越小。容器绑核的核心目的之一就是最大化缓存命中率。

  • L1 缓存(一级缓存):每个核心独享,分为 L1d(数据)和 L1i(指令),典型大小 32KB~64KB,延迟约 1ns(4 个 CPU 周期)。
  • L2 缓存(二级缓存):每个核心独享或两个核心共享,典型大小 256KB~1MB,延迟约 3~4ns。
  • L3 缓存(三级缓存):同一 CPU 插槽内所有核心共享,典型大小 8MB~64MB,延迟约 10~15ns。
容器绑核的缓存收益:当容器被绑定到固定核心上运行时,其工作集(working set)可以持续驻留在 L1/L2 缓存中。如果容器频繁在不同核心间迁移,缓存内容会被逐出,导致缓存缺失(cache miss),内存访问延迟从 ~1ns 飙升到 ~100ns(主存访问)。
CPU 缓存层级结构 CPU 缓存层级金字塔 L1 缓存(32KB~64KB / 核心) 延迟 ~1ns | 核心独享 L2 缓存(256KB~1MB / 核心) 延迟 ~3ns | 核心独享或双核共享 L3 缓存(8MB~64MB / 插槽) 延迟 ~10ns | 同一插槽所有核心共享 主存(DRAM,数十GB) 延迟 ~100ns | 所有核心共享

2.3 超线程(Hyper-Threading)原理与绑核陷阱

超线程技术(Intel 称 HT,AMD 称 SMT)允许一个物理核心同时运行两个线程。每个逻辑核心(Logical CPU)共享该物理核心的执行单元和 L1/L2 缓存。这对容器绑核既是机遇也是陷阱。

绑核陷阱:如果容器绑定了同一个物理核心上的两个逻辑核心(如 CPU 0 和 CPU 1 是同一物理核心的两个 HT 线程),这两个容器会竞争执行单元和缓存,导致性能下降而非提升。containerd 的 CPU 管理器默认会识别并避免这种情况,但手动绑核时必须检查 /sys/devices/system/cpu/cpu*/topology/thread_siblings_list。

2.4 拓扑查看命令速查表

在调优前,必须掌握以下命令来获取当前系统的 CPU 拓扑信息:

命令 输出内容 用途
lscpu CPU 架构、核心数、线程数、NUMA 节点数 快速概览系统拓扑
numactl --hardware NUMA 节点分布、每个节点的 CPU 列表和内存大小 确认 NUMA 拓扑,指导绑核策略
cat /proc/cpuinfo 每个逻辑 CPU 的详细信息,包括 physical id、core id 识别物理核心与逻辑核心的对应关系
ls /sys/devices/system/cpu/cpu*/topology/ thread_siblings_list、core_siblings_list、package_cpus_list 精确查看哪些逻辑 CPU 共享物理核心或 L3 缓存
lstopo 图形化或文本化的完整拓扑树 可视化查看缓存层级、NUMA 节点和 PCI 设备关联
# 示例:查看逻辑核心 0 和 1 是否属于同一物理核心
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,1
# 输出表明 CPU 0 和 CPU 1 是同一物理核心的两个超线程

2.5 本章小结