4. BIOS与固件层性能调优

数据库服务器的性能瓶颈往往不在SQL语句本身,而在更底层的固件配置。AMD EPYC平台把内存控制器、PCIe控制器、NUMA拓扑、SMT调度等大量硬件行为交给BIOS/UEFI固件决定,同一颗CPU在不同BIOS设置下,OLTP吞吐量差异可达20%~40%。本节围绕数据库负载最敏感的几组选项展开:电源策略、NUMA节点交织、SMT、IOMMU与PCIe ACS,说明它们各自影响什么、默认值为何常常不适合数据库、以及如何设置与验证。

电源策略:决定频率能否“顶住”

EPYC的电源管理由多个层次共同决定。BIOS中的Determinism Slider(确定性滑杆)控制P-State切换的激进程度,可设为Power、Performance或Manual;APBDIS(Algorithm Performance Boost Disable)关闭后允许算法动态提升频率;DF C-states控制Infinity Fabric数据互联结构的低功耗状态;Package C-state Limit限制封装级休眠深度。数据库是持续高并发、低延迟敏感型负载,最怕的是核心在空闲瞬间跌入深C-state,下一次请求到来时唤醒延迟被计入事务响应时间。

推荐做法是:将Determinism Slider设为Performance或Manual并把P0频率锁定在基频以上;APBDIS设为1(禁用动态降频算法)以保持频率稳定;DF C-states设为Disabled,避免Infinity Fabric进入低功耗态导致跨CCD访问延迟抖动;Package C-state Limit设为C0/C1。代价是功耗与散热上升,但对数据库而言,稳定的低延迟远比省几瓦电重要。验证方式是在数据库压测期间用cpupower frequency-info或turbostat观察各核心是否长期停留在P0,若频繁在P1/P2间跳变,说明电源策略仍不够激进。

NUMA节点交织:NPS与内存本地性

EPYC的NUMA结构由BIOS中的NPS(Nodes Per Socket)选项决定,可取NPS1、NPS2、NPS4。NPS1把整个Socket视为一个NUMA节点,内存访问延迟均一但带宽争用严重;NPS4把每个Socket拆成4个NUMA节点,内存本地性最好,但操作系统和数据库需要正确识别拓扑。对于内存密集型的数据库,NPS4通常能带来更低的本地内存延迟,但前提是数据库进程的内存分配要绑定到本地节点。

与之相关的是Memory Interleaving(内存交织)。开启交织后,连续物理地址会均匀分布到各内存通道,提升带宽但牺牲单点延迟可预测性;关闭交织则让每个NUMA节点的内存访问更集中。数据库场景建议:OLTP用NPS4并关闭跨节点交织,让每个数据库实例或每个NUMA节点绑定独立内存;OLAP/分析型负载可用NPS1配合交织,换取更高聚合带宽。设置后必须用numactl --hardware确认节点数与CPU分布,再用lscpu | grep NUMA核对,避免操作系统看到的拓扑与BIOS不一致。

EPYC BIOS关键选项对数据库性能的影响路径 BIOS / UEFI 选项 Determinism Slider Performance APBDIS / DF C-states 禁用降频与休眠 NPS (Nodes/Socket) NPS1 / NPS2 / NPS4 Memory Interleaving 开 / 关 SMT Mode Auto / Enabled / Disabled IOMMU / PCIe ACS Enabled / Disabled 硬件行为影响 核心频率稳定性 P0驻留率 / 唤醒延迟 Infinity Fabric延迟 跨CCD/跨节点访问 内存本地性 本地/远端访问比例 内存带宽分布 通道均衡 / 争用 逻辑核心数 线程争用 / 缓存命中 DMA重映射开销 IOMMU页表 / ACS隔离 数据库可观测指标 事务响应时间 P99 / P999 频率抖动直接放大尾延迟 QPS / TPS 吞吐量 受带宽与核心数共同约束 Buffer Pool 命中率 内存本地性影响缓存效率 Redo/日志写入延迟 PCIe ACS与IOMMU影响NVMe CPU利用率与等待分布 SMT开启后需区分物理/逻辑核 跨NUMA远端访问占比 numastat / perf c2c 可观测 决定 体现为 调优顺序建议:先锁定电源与频率 → 再定NPS与交织 → 最后评估SMT与IOMMU/ACS

SMT:逻辑核心是帮手还是干扰

SMT(同步多线程)让每个物理核心呈现两个逻辑核心。对数据库而言,SMT的价值取决于负载类型:高并发短事务的OLTP通常能从SMT获益,因为大量线程在等待I/O或锁时,另一个线程可以占用执行单元;但计算密集、缓存敏感的查询(如大表扫描、哈希连接)可能因两个线程争抢L1/L2缓存而性能下降。BIOS中SMT Mode一般设为Auto,建议在数据库压测中分别测试Enabled与Disabled两种状态,观察TPS与P99的变化。若开启SMT后P99明显恶化而TPS提升有限,应关闭SMT,让每个物理核心独占缓存。

需要注意的是,关闭SMT后操作系统看到的逻辑CPU数减半,数据库的并行度参数(如max_parallel_workers、parallel_max_servers)和连接池上限都要相应调整,否则会出现线程争用。验证时可用lscpu -e查看CPU与核心的对应关系,确认哪些逻辑核共享同一物理核。

IOMMU与PCIe ACS:虚拟化与直通设备的取舍

IOMMU负责DMA重映射与设备隔离,是虚拟化直通(VFIO)和SR-IOV的必要条件,但开启后会为每次DMA增加页表翻译开销,对高IOPS的NVMe数据库日志写入有可测量的延迟影响。PCIe ACS(Access Control Services)控制PCIe交换机端口间的隔离,开启后同一交换机下的设备无法直接点对点通信,所有流量必须绕行Root Complex,增加延迟。

设置建议:如果数据库运行在物理机上、不使用设备直通,可将IOMMU设为Disabled、ACS设为Disabled,让NVMe和网卡走最短路径;如果使用虚拟机或需要SR-IOV网卡,则必须开启IOMMU,此时应尽量把数据库日志盘直通给虚拟机,并确认ACS在直通路径上被关闭(部分平台提供ACS Override选项)。验证方法是用lspci -vvv | grep -i acs查看ACS能力与状态,用dmesg | grep -i iommu确认IOMMU是否启用,再对比开启前后NVMe的4K随机写延迟。

BIOS调优没有“一套通吃”的配置。建议每次只改一组选项,用相同的数据库压测脚本(固定并发、固定数据集、固定时长)对比TPS、P99和CPU频率分布,确认收益后再进入下一组。改动前记录原始BIOS配置,便于回退。

一组可参考的数据库BIOS配置基线

选项OLTP建议OLAP建议主要影响
Determinism SliderPerformancePerformance频率稳定性
APBDIS1(禁用)1(禁用)避免动态降频
DF C-statesDisabledDisabledInfinity Fabric延迟
NPSNPS4NPS1内存本地性/带宽
Memory InterleavingDisabledEnabled延迟可预测性/带宽
SMT压测后决定通常Disabled缓存争用/线程数
IOMMU物理机Disabled物理机DisabledDMA开销
PCIe ACSDisabledDisabled设备点对点延迟

表中数值是示例基线,实际应以压测结果为准。一个可复现的验证流程是:先在默认BIOS下跑30分钟基准压测,记录TPS、P99、turbostat频率分布和numastat远端访问比例;然后按“电源→NUMA→SMT→IOMMU/ACS”的顺序逐组调整,每组调整后重复相同压测,只有当前组带来稳定正向收益时才保留。这样既能定位每个选项的真实贡献,也能避免多选项叠加后无法归因。