2. AMD EPYC处理器架构与内存子系统解析

在做EPYC平台的内存容量规划之前,必须先理解一个关键事实:EPYC并不是一块"铁板一块"的大芯片,而是由多个小芯片(Chiplet)通过高速互连拼装而成的多芯片模块(MCM)。这个物理结构直接决定了内存通道的归属、访问延迟的差异,以及NUMA域如何划分。如果忽略这一点,只按"总通道数×单条容量"来算内存,规划出来的配置很可能在真实负载下出现明显的带宽倾斜和延迟抖动。

CCD、IOD与Infinity Fabric:EPYC的三层骨架

以EPYC 9004系列(Genoa)为例,一颗处理器内部包含两类核心模块:

  • CCD(Core Complex Die):每个CCD集成8个Zen 4核心,以及该核心组共享的32MB L3缓存。Genoa最多12个CCD,合计96核。CCD只负责计算,本身不直接连接内存。
  • IOD(I/O Die):全芯片只有一个IOD,集中承载12条DDR5内存通道、PCIe 5.0/CXL控制器、以及Infinity Fabric的片上交换网络。所有CCD通过Infinity Fabric挂接到IOD上。
  • Infinity Fabric(IF):连接CCD与IOD、以及IOD内部各分区的高速总线。它既传输数据,也传输一致性协议消息,其带宽和延迟是跨CCD访问内存时的关键变量。

这种"计算与内存分离"的结构意味着:任何一个核心访问内存,数据都必须经过CCD→IF→IOD→内存控制器的路径。因此,内存通道在物理上归属于IOD,而不是归属于某个CCD。

EPYC 9004 芯片级架构与内存通道归属 CCD 0 8×Zen4 + 32MB L3 CCD 1 8×Zen4 + 32MB L3 CCD 2 8×Zen4 + 32MB L3 ··· CCD 11 8×Zen4 + 32MB L3 Infinity Fabric 片上互连(数据 + 一致性消息) IOD(I/O Die)— 内存控制器与PCIe/CXL集中区 UMC 0-1 CH A/B UMC 2-3 CH C/D UMC 4-5 CH E/F UMC 6-7 CH G/H UMC 8-9 CH I/J UMC 10-11 CH K/L DIMM A/B DIMM C/D DIMM E/F DIMM G/H DIMM I/J DIMM K/L NUMA 域划分 NPS=1:整颗CPU为1个域 NPS=2:每6通道为1域 NPS=4:每3通道为1域 NPS=8:每1.5通道为1域 域内访问:低延迟 跨域访问:经IF,延迟↑

内存控制器与通道映射

IOD内部集成了12个统一内存控制器(UMC),每个UMC管理一条DDR5通道。12条通道被组织为6组,每组2条通道共享一个UMC对。在双路系统中,两颗CPU各自拥有独立的12通道,合计24通道。以DDR5-4800为例,单通道理论带宽为38.4GB/s,12通道合计约460.8GB/s,双路可达921.6GB/s。这个数字是容量规划时判断"内存带宽是否成为瓶颈"的基准线。

关键点在于:内存通道的物理位置在IOD上,而计算核心在CCD上。因此,当CCD 0上的核心访问DIMM A/B时,数据路径是CCD 0→IF→IOD→UMC 0-1→DIMM A/B。如果访问的是DIMM K/L,路径相同但经过的IOD内部交换节点更多,延迟会略高。这种差异在NPS=1时被BIOS隐藏为一个统一NUMA节点,但物理延迟差异依然存在。

NUMA域对容量规划的实际影响

EPYC提供NPS(Nodes Per Socket)设置,决定操作系统看到几个NUMA节点。常见取值:

NPS设置NUMA域数量每域通道数典型适用场景
NPS=1112内存带宽敏感、延迟不敏感的大内存应用
NPS=226通用虚拟化、数据库
NPS=443NUMA感知型HPC、内存数据库
NPS=881.5(实际按通道组)极致低延迟、小内存块高频访问

容量规划时,NPS的选择会直接影响"每域可用内存"的计算。例如,配置12条64GB DDR5,总容量768GB。若NPS=4,则每个NUMA域分到3条通道,即192GB。如果某个应用进程被绑定到单个NUMA域,它最多只能直接使用192GB本地内存,超出部分需要跨域访问,延迟增加约30%~50%(具体取决于IOD内部路由)。因此,在规划大内存应用时,必须同时考虑"总容量"和"单域容量"两个指标。

规划提示:对于内存容量超过512GB且对延迟敏感的应用(如SAP HANA、Redis集群),建议先确认应用的NUMA亲和性策略。如果应用不支持跨NUMA调度,则单域容量必须大于应用峰值内存需求,否则会出现频繁的远程内存访问,吞吐量下降。

Infinity Fabric带宽与内存容量的匹配

Infinity Fabric的带宽并非无限。在Genoa中,IF的总带宽设计为与12通道DDR5带宽相匹配,但这是双向共享的。当CCD数量增多、跨CCD访问频繁时,IF可能成为瓶颈。一个实用的判断方法是:如果应用的内存访问模式是"每个核心访问自己附近的内存",IF压力小;如果是"所有核心随机访问全部内存",IF压力大,此时增加内存容量并不能线性提升性能,反而可能因为IF拥塞导致延迟上升。

因此,在容量规划中,除了计算总容量和单域容量,还应估算IF带宽利用率。一个简化的估算公式:

IF需求带宽 ≈ 核心数 × 每核心平均内存带宽需求
IF可用带宽 ≈ 12通道 × 单通道带宽 × IF效率系数(约0.7~0.85)
若 IF需求带宽 > IF可用带宽 × 0.8,则需考虑减少跨CCD访问或调整NPS

例如,96核全部满载,每核心平均需要8GB/s内存带宽,则IF需求为768GB/s,而12通道DDR5-4800可用约460.8GB/s×0.8≈368.6GB/s,明显不足。此时应优先考虑提升内存频率(如DDR5-5600)或减少每核心带宽需求(如增加缓存命中率),而不是单纯增加内存容量。

容量规划中的实际检查清单

结合上述架构分析,在做EPYC大内存平台容量规划时,建议按以下顺序核对:

  1. 确认NPS设置:根据应用NUMA亲和性选择NPS=1/2/4/8,并计算单域容量。
  2. 计算总容量与单域容量:总容量 = 通道数 × 单条容量;单域容量 = 总容量 / NUMA域数。
  3. 核对单域容量是否满足应用峰值:若应用绑定单域,单域容量必须大于峰值内存需求。
  4. 估算IF带宽利用率:核心数 × 每核心带宽需求 vs 可用IF带宽,避免IF成为瓶颈。
  5. 确认DIMM类型与通道填充方式:12通道应全部填充相同容量和规格的DIMM,避免通道间容量不均导致NUMA域容量失衡。
  6. 验证BIOS中内存交错设置:确认是否开启通道交错(Channel Interleaving),以及是否与NPS设置匹配。
常见误区:只按"总容量"规划,忽略NPS和单域容量。例如,配置768GB但NPS=8,单域仅96GB,若应用需要200GB本地内存,则必然跨域,性能大幅下降。另一个误区是混插不同容量DIMM,导致部分通道容量偏小,NUMA域容量不均,操作系统可能将大内存域优先分配,造成负载倾斜。