2. AMD EPYC处理器架构与功耗特性

要谈EPYC节点的功耗与散热优化,第一步不是调风扇曲线,而是把“电到底花在哪里”这件事拆开。AMD EPYC(霄龙)从Zen 1的Naples到Zen 5的Turin,一直沿用“多芯片模块(MCM)+ 中央I/O芯片”的拼片思路:计算核心被切成若干块CCD(Core Complex Die,核心复合体裸片),再通过IOD(I/O Die,输入输出裸片)把内存、PCIe、Infinity Fabric汇聚起来。理解这套架构,才能理解为什么同一颗CPU在不同负载下功耗分布差异巨大,也才能理解TDP与cTDP这两个参数到底在约束什么。

一、CCD与IOD:功耗的两大“账本”

在典型的EPYC 7002/7003(Rome/Milan)封装里,一颗CPU由8个CCD加1个IOD组成;到了EPYC 9004(Genoa),IOD被拆成1个主IOD加若干sIOD,CCD数量最多可达12个。每个CCD内部包含若干CCX(Core Complex),每个CCX由4个或8个Zen核心共享一块L3缓存。以Milan为例,一个CCD含2个CCX、共8个核心、32MB L3;Genoa的CCD则升级为8核心、32MB L3,并支持更高的每核心L3带宽。

从功耗角度看,CCD是“动态功耗大户”:核心执行指令、L3被频繁命中时,CCD的功耗随负载线性上升,且对电压极其敏感——因为核心频率与电压的平方成正比。IOD则是“静态功耗大户”:它承载内存控制器(UMC)、PCIe/CXL控制器、Infinity Fabric的SerDes链路,即使核心空闲,只要内存和I/O在跑,IOD也会持续消耗几十瓦。这就解释了一个常见现象:一台EPYC节点在“空载但内存满配、网卡在线”时,整机功耗仍可能高达150W以上,其中相当一部分来自IOD和内存。

二、Infinity Fabric:看不见的功耗通道

Infinity Fabric(IF)是连接CCD、IOD、内存和I/O的片上/封装内互连。它分为SDF(Scalable Data Fabric,负责CCD与IOD、IOD与内存之间的数据搬运)和SCF(Scalable Control Fabric,负责管理、时钟、复位等控制流)。IF的功耗与两个因素强相关:一是链路速率(FCLK,Fabric Clock),二是跨CCD/跨IOD的访问比例。

这里有一个对优化非常关键的耦合关系:在Zen 2/Zen 3上,内存控制器时钟UCLK与FCLK存在1:1或1:2的同步模式。当FCLK拉高到1900MHz以上时,IF链路功耗明显增加,但内存延迟下降;反之,把FCLK降到1600MHz可以省下几瓦到十几瓦,代价是跨CCD访问延迟上升。对于延迟敏感的数据库负载,通常保留1:1同步;对于吞吐型、内存带宽受限的负载,则可以在功耗与性能之间做取舍。这个“FCLK/UCLK/MCLK”三时钟关系,是EPYC功耗调优中最容易被忽视、却最值得动手的地方。

EPYC 封装内功耗分布与数据通路示意 CCD 动态功耗为主 · IOD 静态功耗为主 · Infinity Fabric 连接两者 CCD 0 8× Zen Core 32MB L3 CCD 1 8× Zen Core 32MB L3 CCD 2 8× Zen Core 32MB L3 CCD 3 8× Zen Core 32MB L3 CCD 4 8× Zen Core 32MB L3 CCD n … Infinity Fabric (SDF / SCF) FCLK 同步链路 · 跨 CCD/IOD 数据搬运 · 功耗随速率与跨片访问比例上升 IOD (I/O Die) 内存控制器 UMC · PCIe/CXL 控制器 · IF SerDes · 安全处理器 静态功耗为主:核心空闲时仍持续消耗数十瓦 UCLK 内存时钟 · MCLK 内存物理时钟 DDR5 内存通道 12ch · 每通道 1–2 DIMM PCIe / CXL 通道 128 lanes · Gen5/Gen6 外部 I/O 网卡 · NVMe · GPU CCD 动态功耗 IOD 静态功耗 内存/I/O 功耗

三、TDP与cTDP:不是“功耗上限”,而是“散热设计点”

很多人把TDP(Thermal Design Power)理解为CPU的最大功耗,这是不准确的。TDP是AMD给OEM/散热设计者的“散热设计目标”:在基准频率、典型负载下,散热器需要能持续带走的热量。EPYC 7003的TDP档位常见为120W、155W、180W、200W、225W、240W、280W;EPYC 9004则扩展到200W–400W,Turin进一步到500W级别。同一颗CPU型号,往往对应一个默认TDP,但可以通过cTDP(configurable TDP)在相邻档位之间调整。

cTDP的机制是:BIOS或BMC把目标TDP写入CPU的SMU(System Management Unit),SMU据此调整PPT(Package Power Tracking,封装功耗跟踪上限)、TDC(Thermal Design Current,电流上限)和EDC(Electrical Design Current,电气电流上限)。以EPYC 9354(32核,默认280W)为例,若把cTDP下调到240W,SMU会降低全核加速频率的上限,PPT从约1.35×TDP降到约1.15×TDP,从而让散热器更容易压住温度;反之,把cTDP上调到300W,则允许更高的持续加速频率,但需要更强的散热和供电。

关键理解:TDP是“散热设计点”,PPT才是“实际允许的瞬时功耗上限”。PPT通常为TDP的1.15–1.35倍,具体取决于型号和BIOS策略。调优时先看PPT是否被触发,再看温度是否成为瓶颈。

四、代际差异:从Naples到Turin的功耗重心迁移

不同代际EPYC的功耗分布并不相同。Zen 1 Naples(7001)的IOD相对简单,CCD数量为4个,内存通道8条,IOD功耗占比约20%–25%。Zen 2 Rome(7002)把IOD做大,支持8通道DDR4和128条PCIe 4.0,IOD功耗占比上升到30%左右。Zen 3 Milan(7003)沿用Rome的IOD,但CCD升级为8核心共享32MB L3,核心能效提升,IOD占比进一步凸显。Zen 4 Genoa(9004)引入5nm CCD + 6nm IOD,支持12通道DDR5和128条PCIe 5.0,IOD面积和功耗都显著增加,空载IOD功耗可达50W以上。Zen 5 Turin(9005)继续提升核心密度,同时把内存通道扩展到12条DDR5-6000,IOD的SerDes功耗成为不可忽视的固定开销。

这意味着:对老一代Naples/Rome节点,优化重点在核心电压与频率曲线;对Genoa/Turin节点,优化重点往往在IOD侧——包括内存频率选择、PCIe链路宽度、CXL设备是否常驻、以及FCLK是否与UCLK同步。忽略IOD的“底噪”,再精细的核心调优也难以把整机功耗压下来。

五、把架构知识落到节点优化上

结合上述结构,可以形成一套可操作的判断顺序。第一步,用lscpu和numactl -H确认CCD数量、NUMA节点分布和内存通道数,判断负载是否跨CCD访问。第二步,读取/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq和amd_pstate状态,观察核心频率是否被PPT限制。第三步,用turbostat查看PkgWatt、CoreWatt、GFXWatt等分项,定位功耗是集中在核心还是IOD。第四步,在BIOS中调整cTDP、FCLK/UCLK比例和内存频率,每次只改一个变量,用同一负载复测。

# 示例:查看EPYC节点的NUMA与频率信息(示例命令,输出因平台而异)
lscpu | grep -E "Model name|Socket|Core|NUMA|MHz"
numactl -H
turbostat --interval 2 --show PkgWatt,CoreWatt,RAMWatt,GFXWatt
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

需要强调的是,以上命令的输出会因BIOS版本、内核版本和EPYC代际不同而变化,不能直接当作实测结论。真正可靠的判断,是在固定负载、固定环境温度下,对比调整前后的PkgWatt与温度曲线。只有把“CCD动态功耗、IOD静态功耗、IF链路功耗、内存功耗”四本账分开看,才能知道每一瓦该从哪里省、省下来会不会影响性能。

注意:下调cTDP并不等于线性省电。当cTDP从280W降到240W时,整机功耗可能只下降5%–8%,因为IOD和内存的固定功耗不随cTDP变化。若目标是显著降低节点功耗,应同时评估内存频率、PCIe链路和FCLK策略。

总结来看,EPYC的功耗特性由“CCD负责动态、IOD负责静态、Infinity Fabric负责连接开销”这三条主线决定。TDP给出散热设计边界,cTDP给出可调范围,PPT决定瞬时上限。理解这套架构与参数关系,后续的散热器选型、风扇曲线、机柜风道和功耗封顶策略才有依据,而不是凭感觉调参。