
香港 MEGA-i 机房机柜顶部的 BMC 指示灯在昏黄的应急灯下一闪一闪。客户白天反馈数据库高峰时延偶发抬头,我判定问题和 CPU 睿频策略、内存 ECC 行为以及 NVMe 固件有关。维护窗口只有 90 分钟——这篇就是我从“拉闸”到“收尾”的全过程:我查了什么、动了什么、为什么这么动,以及中途遇到的坑是怎么现场解的。
1)现场环境与变更目标
| 机柜/节点 | 主板/机型 | CPU | 内存 | NVMe | BIOS/UEFI | BMC/IPMI | OS |
|---|---|---|---|---|---|---|---|
| HK-RACK07 / node-3 | Supermicro 2U(X12 系列) | Intel Xeon Silver 4314(Ice Lake, 16C)×2 | 256GB ECC RDIMM(8×32G, 3200MT/s, 双路 8 通道) | Samsung PM9A3 3.84TB ×4(U.2, PCIe 4.0) | 2.3b | 1.24 | CentOS 7.9(3.10 内核,客户历史原因固定) |
| HK-RACK07 / node-4 | Dell R7525 | AMD EPYC 7443P(Milan, 24C)×1 | 256GB ECC RDIMM(8×32G, 3200MT/s) | Intel P4510 4TB ×4(U.2, PCIe 3.1) | 2.6.4 | 4.40.00 | CentOS 7.9 |
注:客户应用以 OLTP + 混合分析为主,最高峰写入带宽不大,但 P99/P999 延迟对业务极其敏感。目标是在不牺牲稳定性的前提下,降低毛刺、拉齐核间频率波动,并修复两块盘固件的已知掉速 bug。
本次维护目标
- CPU:打开 Turbo,但限制“短时功耗爆冲”,统一 AVX Offset,禁用 EET(Energy Efficient Turbo)避免频率抖动,核间一致性更好。
- 内存:确认 ECC Scrub 策略,开启 Patrol Scrub(低频),保持 JEDEC 正常频率;如是工作站板卡才评估 XMP(此单为 RDIMM 服务器,不启用 XMP)。
- NVMe 固件:对 PM9A3 与 P4510 做滚动升级,修复高队列深度下的写入退化问题;升级前后做一致性校验与回滚点。
- OS 配合:CentOS 7 调优(tuned、cpupower、nvme-cli),避免 ASPM 引起的延迟尾部。
2)BIOS/UEFI 参数基线(含 Intel/AMD 两套)
思路:稳定 > 性能。核心就是让频率“可预期”,I/O 时延不被节能策略暗中拉高。
Intel(Xeon Scalable, Ice Lake)——推荐值
| 选项 | BIOS 路径(示意) | 建议值 | 说明 |
|---|---|---|---|
| Intel Turbo Boost Tech | Advanced → CPU Config | Enabled | 开启睿频,但配合功耗窗限制 |
| Long Duration Power Limit (PL1) | Power & Perf | = CPU TDP | 保守等于 TDP,避免长时过热降频 |
| Short Duration Power Limit (PL2) | Power & Perf | 1.2×TDP | 适度短时冲刺,避免 VRM/OCP 告警 |
| Turbo Time Window (Tau) | Power & Perf | 28–56s | 环境温度偏高时取 28s |
| AVX Offset | CPU Config | 2 | AVX 负载下降 2 个倍频,稳定性更好 |
| C-States | CPU Config | C1E Disabled,Package C-State = C0/C1 | 降低延迟抖动 |
| Energy Efficient Turbo (EET) | Power & Perf | Disabled | 避免频率抖动造成长尾 |
| Hyper-Threading | CPU Config | Enabled | 数据库型通常更友好;极端低延迟可评估关闭 |
| PCIe ASPM | Chipset | Disabled | 避免链路省电导致 I/O 抖动 |
| Above 4G Decoding / Resizable BAR | PCIe | Enabled | I/O 映射更友好 |
| NUMA Cluster on Die | Memory | Auto/Disabled | 以平台默认为宜,避免异常拓扑 |
AMD(EPYC, Milan)——推荐值
| 选项 | BIOS 路径(示意) | 建议值 | 说明 |
|---|---|---|---|
| SMT | CPU | Enabled | 大多数数据库更均衡 |
| cTDP | CPU/Power | Default | 保守设定 |
| Determinism Slider | CPU/Power | Performance | 频率更一致 |
| NPS(NUMA per Socket) | Memory | NPS1/NPS2 | 看内存条分布与应用特征 |
| APBDIS | Power | Enabled | 锁定更稳定的频率曲线 |
| Global C-State Control | CPU | Disabled | 降低时延尾部 |
| PCIe ASPM | Chipset | Disabled | 同上 |
| Above 4G Decoding | PCIe | Enabled | 同上 |
内存 ECC / XMP 策略
服务器 RDIMM/LRDIMM:不使用 XMP(XMP 面向 U-DIMM/消费级),保持 JEDEC 3200 MT/s,开启 Patrol Scrub(低频) 与 Demand Scrub(默认),并设置 Correctable Error Threshold 告警阈值,开 Memory Page Retire。
少数准系统/工作站板(例如 Z 系列)才会出现 XMP;若必须拉频率:先做 冷启动压力测试 + ECC 注入测试,并准备 远程清 CMOS 手段,否则极易陷入训练失败的重启循环。
3)OS 侧工具与即时校验(CentOS 7)
# 基础工具
yum install -y kernel-tools tuned nvme-cli smartmontools msr-tools ipmitool
# CPU 频率与省电
tuned-adm profile throughput-performance
cpupower frequency-info
cpupower set --governor performance
# 避免 ASPM(也可 BIOS 里关)
grubby --args="pcie_aspm=off" --update-kernel ALL
# 验证 Turbo(Intel)
modprobe msr
# 读取 IA32_PERF_STATUS 等寄存器需要 msr-tools;turbostat(新核)可替代
turbostat -i 1 -d 5 # 若内核过旧,考虑用 perf+pmu 观测
# NVMe 盘查
nvme list
nvme smart-log /dev/nvme0
nvme id-ctrl /dev/nvme0 | egrep "mn|fr|ps"
4)NVMe 固件升级:策略、矩阵与脚本
升级策略关键点
- 分批滚动:同一阵列/卷的多块盘绝不同时动手;一主一备轮换。
- 低温、足电:确认风道畅通、盘温 ≤ 55℃;IPMI 看 12V 电流裕量,避免固件写入中 OCP。
- 写缓存策略:数据库进入降载模式;复制/截断写队列,确保 fsync 命令不堆。
- 先查“是否需要重启激活”:大多数企业 NVMe 需要 fw-commit + power-cycle。
- 留好回滚点:记录现有固件 fr,并预先下载回退镜像(若厂商提供)。
升级矩阵(示例)
| 设备 | 型号 | 当前固件 | 目标固件 | 行动 | 风险提示 |
|---|---|---|---|---|---|
| /dev/nvme0 | Samsung PM9A3 3.84TB | GDC5QFX7 | GDC6QGXA | 升级 | 高 QD 写入尾延迟修复 |
| /dev/nvme1 | Samsung PM9A3 3.84TB | GDC5QFX7 | GDC6QGXA | 升级 | 同上 |
| /dev/nvme2 | Intel P4510 4TB | VDV10131 | VDV10190 | 升级 | 稳定性与写放大优化 |
| /dev/nvme3 | Intel P4510 4TB | VDV10131 | VDV10190 | 升级 | 同上 |
版本号仅为示例,不同批次会变,请以厂商发布为准。务必阅读发行说明(Release Notes)和激活条件。
标准操作命令
# 读取固件信息
nvme id-ctrl /dev/nvme0 | egrep "mn|fr"
# 下载新固件镜像(厂商提供的 .bin);此处假设已置于 /root/fw/
nvme fw-download /dev/nvme0 --fw=/root/fw/pm9a3_gdc6qgxa.bin
# 提交并标记下次重启激活(action=1)
nvme fw-commit /dev/nvme0 --slot=1 --action=1
# 若发行说明要求立即复位控制器(小概率):谨慎使用
nvme reset /dev/nvme0
# 重启后复核:
nvme id-ctrl /dev/nvme0 | egrep "mn|fr"
nvme smart-log /dev/nvme0
批量脚本(带温度与状态保护)
#!/bin/bash
set -euo pipefail
declare -A FW_MAP=(
["/dev/nvme0"]="/root/fw/pm9a3_gdc6qgxa.bin"
["/dev/nvme1"]="/root/fw/pm9a3_gdc6qgxa.bin"
["/dev/nvme2"]="/root/fw/p4510_vdv10190.bin"
["/dev/nvme3"]="/root/fw/p4510_vdv10190.bin"
)
for dev in "${!FW_MAP[@]}"; do
echo "==> Check $dev"
temp=$(nvme smart-log $dev | awk '/temperature/ {print $3}')
if [[ -z "$temp" || "$temp" -gt 55 ]]; then
echo "ERROR: $dev temp=$temp℃ too hot; improve airflow then retry."
exit 1
fi
curfw=$(nvme id-ctrl $dev | awk -F: '/fr/ {gsub(/ /,"",$2); print $2}')
echo "Current FW: $curfw -> New FW: $(basename ${FW_MAP[$dev]})"
nvme fw-download $dev --fw="${FW_MAP[$dev]}"
nvme fw-commit $dev --slot=1 --action=1
echo "Marked $dev for FW activation on reboot"
done
echo "All devices staged. Please schedule controlled reboot now."
5)“踩坑”与现场处置
坑 1:EET(Energy Efficient Turbo)导致 P99 时延毛刺
表现:CPU 频率在 2.8–3.4GHz 之间反复抽动,I/O 并不高但延迟尾巴加长。
处置:BIOS 里 禁用 EET,OS 侧 tuned 切 throughput-performance,pcie_aspm=off,P99 立刻回落约 15–20%。
坑 2:有人想开 XMP(但这是 RDIMM 服务器)
表现:客户以为“把 3200 拉到 3600 就更快”,实际上 RDIMM 不支持 XMP;强行尝试会进 内存训练死循环。
处置:坚持 JEDEC,开启 ECC Patrol Scrub;同时把 Correctable Error 阈值调低,便于早期告警。
预案:若误操作导致无法过训练,用 BMC 远程清 CMOS(厂商工具或跳线),必要时 ipmitool chassis power off + 机框外设复位。
坑 3:NVMe 固件“需要重启激活”,但线上强制 nvme reset 卡住
表现:fw-commit 后直接 nvme reset 少数机型会短暂失联,阵列上层误判为盘损。
处置:严格按发布说明执行:只做下载与提交,统一重启激活;升级批次交错进行,阵列始终保留冗余。
监控:升级前后用 nvme smart-log 对比 media_errors 与 temperature,确认无异常攀升。
坑 4:功耗窗放太开触发 VRM 温度保护
表现:把 PL2 调太高,短时跑压测时 CPU 包温与 VRM 温度一起上去,BMC 出告警,反而降频更狠。
处置:PL2 限制在 1.2×TDP 左右,Tau 28–56s,根据机柜风道与季节调节;若夏季或上部机位,取更保守值。
6)变更后验证:指标准入与对比
快速基线(示例)
| 指标 | 变更前 | 变更后 |
|---|---|---|
| CPU 频率稳定度(p95-p50 差值) | 0.55 GHz | 0.18 GHz |
| NVMe 顺序写 P99 延迟(QD=32) | 6.2 ms | 3.8 ms |
| TPCC P99 延迟 | 42 ms | 29 ms |
| 写放大(盘侧估算) | 1.42× | 1.25× |
| 盘温(高峰均值) | 58℃ | 52℃ |
注:仅展示相对趋势,实际数据依业务与机位风道而异。
验证命令片段
# CPU 抖动观测(简式)
for i in {1..30}; do grep "cpu MHz" /proc/cpuinfo | awk '{sum+=$4} END{print sum/NR}'; sleep 1; done
# fio 快测(写注意别跑到生产卷)
fio --name=randrw --filename=/mnt/nvme1n1/testfile --size=8G \
--bs=4k --iodepth=32 --rw=randrw --rwmixread=70 --ioengine=libaio \
--runtime=60 --group_reporting --numjobs=4
# NVMe 健康对比
nvme smart-log /dev/nvme0 | egrep "temperature|media_errors|percentage_used|data_units_(written|read)"
7)回滚与配置固化
BIOS 配置备份:
Supermicro:使用厂商工具导出/导入 BIOS 配置或在 BIOS “User Profile” 存档;
Dell:可通过 iDRAC 导出 System Profile(XML)。
固件回滚:
保留旧固件镜像;若厂商支持双镜像槽位,fw-commit --action=2 可切回(视机型)。
文档与 CMDB:
记录每台盘的 sn、fr、激活时间与温度曲线,附加 BMC 事件日志片段;
把 BIOS/固件版本写回 CMDB,并附上当前“性能基线”时间戳。
8)附录:两套“即用型”清单
A. BIOS 巡检清单(打印带去机房)
| 模块 | 检项 | 期望 |
|---|---|---|
| CPU/Turbo | Turbo, EET, C-State, AVX Offset | Turbo=On;EET=Off;C1E=Off;AVX Offset=2 |
| 功耗窗 | PL1/PL2/Tau | PL1=TDP;PL2≈1.2×TDP;Tau=28–56s |
| 内存 | ECC、Patrol/Demand Scrub、Page Retire | 全部启用;XMP=禁用(RDIMM) |
| PCIe | ASPM、Above 4G、Bifurcation(如需) | ASPM=Off;Above 4G=On |
| 安全 | UEFI Secure Boot(视场景)、PXE | 变更窗口内审慎调整 |
| NUMA | NPS/Cluster on Die | 依据平台默认或业务特性 |
B. OS 侧速查
# 性能模式
tuned-adm profile throughput-performance
cpupower set --governor performance
grubby --args="pcie_aspm=off" --update-kernel ALL
# BMC 即时检查(示例)
ipmitool sdr list
ipmitool sel elist | tail -n 20
# NVMe 批量查看
for d in /dev/nvme*n1; do echo "==> $d"; nvme smart-log ${d%*n1} | egrep "temp|media|percentage"; done
重启切换完最后一台盘,BMC 上红色告警清零,我把耳罩摘下来,走出冷通道。走廊里是典型的香港味道:空调风带着一点潮,门外清洁工的拖把在瓷砖上沙沙作响。手机里传来同事的信息:“早高峰压上来了,P99 平稳。”——我把记满 BIOS 选项与固件版本的纸质清单摊在工具箱上,补上最后几条温度与时延数据。
这种活,说难不难,说简单也不简单。每个参数都有它“为什么这样”的上下文,只有在机房里、在业务上,才知道哪一个勾选会换来一条好看的曲线,哪一个“默认”会让你凌晨多待半小时。写下这些,是为了下一次凌晨 2 点,能更从容一点。