3. 数据库服务器硬件选型与EPYC型号对比
数据库服务器的硬件选型,本质上是在“单核性能、核心规模、内存带宽、缓存容量、功耗与散热”之间做取舍。AMD EPYC 从 Naples(7001)、Rome(7002)、Milan(7003)、Genoa(9004)到 Bergamo(97x4)与 Turin(9005),每一代都在核心数、频率、缓存、TDP 和内存通道上发生了明显变化。理解这些差异,才能把 OLTP、OLAP 和混合负载匹配到合适的型号上。
一、代际差异:从“堆核心”到“分层设计”
第一代 Naples 最高 32 核,8 通道 DDR4-2666,每路内存带宽约 170 GB/s,PCIe 3.0。Rome 把核心数翻到 64 核,引入 CCD/IOD 分离结构,8 通道 DDR4-3200,带宽提升到约 204 GB/s,PCIe 4.0。Milan 在 Rome 基础上优化了每核 L3 与频率,最高 64 核,8 通道 DDR4-3200,PCIe 4.0,单核性能明显改善。Genoa 进入 5nm,最高 96 核,12 通道 DDR5-4800,带宽约 460 GB/s,PCIe 5.0,并首次引入最高 384 MB 的 L3。Bergamo(97x4)面向云原生与高密度场景,最高 128 核 Zen 4c,缓存与频率做了取舍。Turin(9005)进一步到 128 核 Zen 5,12 通道 DDR5-6000,带宽约 576 GB/s。
需要特别注意的是,EPYC 的 L3 并非所有核心共享同一块缓存。以 Genoa 为例,每 8 个 Zen 4 核心组成一个 CCD,共享 32 MB L3;96 核型号有 12 个 CCD,合计 384 MB。跨 CCD 访问会经过 IOD,延迟高于 CCD 内部。因此“核心数越多越好”并不成立,数据库负载要关注的是核心与缓存的局部性。
二、OLTP 选型:单核频率与缓存局部性优先
OLTP 的典型特征是大量短事务、随机小 I/O、高并发但每事务计算量小。这类负载对单核频率、L3 命中率和内存延迟非常敏感,核心数超过一定规模后收益递减。以 MySQL 8.0 的 InnoDB 为例,热点索引页和 undo 页会频繁访问 L3,如果工作集能落在单个 CCD 的 32 MB L3 内,跨 CCD 访问带来的延迟抖动会显著减少。
因此 OLTP 选型建议:优先选择高频率、中等核心数的型号,例如 Milan 的 73F3(16 核,3.5 GHz 基频,256 MB L3)或 Genoa 的 9174F(16 核,4.1 GHz 基频,256 MB L3)。如果并发连接数很高,可考虑 32 核的 9354 或 75F3,但要注意把数据库实例的 NUMA 绑定到单个 CCD 或单个 NUMA 节点,避免线程在 CCD 之间迁移。一个可操作的检查方法是:在 my.cnf 中设置 innodb_numa_interleave=OFF,并用 numactl --cpunodebind=0 --membind=0 启动实例,然后观察 SHOW ENGINE INNODB STATUS 中的 Buffer pool hit rate 是否稳定在 99% 以上。
三、OLAP 选型:内存带宽与核心规模优先
OLAP 的典型特征是扫描大表、聚合计算、列式存储、并行度高。这类负载对内存带宽、核心数和 L3 容量最敏感,单核频率反而次要。以 ClickHouse 或 Doris 为例,一次 GROUP BY 聚合可能扫描数十 GB 数据,内存带宽直接决定扫描速度。Genoa 的 12 通道 DDR5-4800 提供约 460 GB/s,是 Rome 的 2.25 倍,这意味着同样的扫描任务,Genoa 平台的理论上限远高于 Rome。
OLAP 选型建议:优先选择 12 通道 DDR5 平台,核心数 64 以上,例如 Genoa 的 9654(96 核,384 MB L3)或 Turin 的 9755(128 核,384 MB L3)。如果预算有限,Rome 的 7742(64 核,256 MB L3)仍可作为入门 OLAP 节点,但要注意其 8 通道 DDR4-3200 的带宽瓶颈。实际部署时,建议把 max_threads 设置为物理核心数的 1.5~2 倍,并开启 max_memory_usage 限制,防止单个查询耗尽内存。
四、混合负载:分层配置与资源隔离
混合负载(HTAP)同时包含 OLTP 事务和 OLAP 分析,最忌讳“一套配置打天下”。更合理的做法是在同一台 EPYC 服务器上做资源分层:把 OLTP 实例绑定到高频率 CCD,把 OLAP 实例绑定到剩余核心,并通过 cgroup 或 numactl 隔离内存带宽。例如 Genoa 9654 有 12 个 CCD,可以分配 2 个 CCD(16 核)给 MySQL,剩余 10 个 CCD(80 核)给 ClickHouse,两者通过 numactl --physcpubind 绑定到不同核心区间。
这种分层配置的关键判断依据是:OLTP 侧的 P99 延迟是否稳定,OLAP 侧的扫描吞吐是否达标。如果 OLTP 延迟出现周期性抖动,通常说明 OLAP 查询抢占了内存带宽或 L3,需要进一步收紧 OLAP 的并发度或内存配额。
五、选型决策表(示例)
下表给出一个可直接参考的选型决策表,参数为示例值,实际采购时需结合具体型号规格书和业务压测结果调整。
| 负载类型 | 核心数倾向 | 频率倾向 | 内存通道 | L3 倾向 | 推荐型号示例 |
|---|---|---|---|---|---|
| OLTP | 16–32 核 | 高基频(≥3.5 GHz) | 8–12 通道 | 大 L3,单 CCD 命中 | Milan 73F3 / Genoa 9174F |
| OLAP | 64–128 核 | 中等基频即可 | 12 通道 DDR5 | 384 MB 优先 | Genoa 9654 / Turin 9755 |
| 混合负载 | 按 CCD 分层 | OLTP 侧高、OLAP 侧中 | 12 通道 DDR5 | 384 MB 优先 | Genoa 9654 + numactl 绑定 |
NUMA nodes per socket 设置为 NPS4 或 NPS1。NPS4 把每个 socket 拆成 4 个 NUMA 节点,能降低内存延迟,但会增加跨节点访问的复杂度;NPS1 则相反。数据库场景通常推荐 NPS4,并用 numactl --hardware 确认节点分布后再绑定实例。
总结来说,EPYC 代际差异的核心是“内存带宽翻倍、核心数翻倍、缓存分层”。OLTP 选高频大 L3 的中核型号,OLAP 选 12 通道 DDR5 的高核型号,混合负载用 numactl 做 CCD 级隔离。把这三个原则落到具体型号和绑定参数上,才能让数据库服务器在真实负载下发挥出 EPYC 的应有性能。