3. ASPM 的配置方法:BIOS、操作系统与驱动

ASPM 这东西,说到底不是光靠硬件就能自动跑起来的。你得在三个层级上都把它打开才行——BIOS、操作系统、设备驱动。缺一个,它就不会工作。我在项目里见过不少“硬件明明支持,功耗却降不下来”的案例,最后查了一圈,全是配置层面没对齐。

好,我们一层一层拆开来看。

3.1 BIOS 设置:第一道关卡

BIOS 是 ASPM 的“总闸”。你想想,如果主板固件里就把 ASPM 关了,那操作系统再怎么调也不会有用。

我个人习惯,拿到新板卡后第一件事就是进 BIOS 确认以下选项:

  • ASPM Support – 通常叫「ASPM」或「Active State Power Management」,设为 Enabled 或 Auto。
  • PCIe ASPM Level – 有些老 BIOS 只有 L0s / L1 / L0s+L1。我建议直接选 L0s+L1,兼容性最好。
  • Native ASPM – 如果主板支持,设为 Enabled。这能让操作系统接管 ASPM 策略,后文会讲。
BIOS 项推荐值备注
ASPM SupportEnabled / Auto关闭后全链路失效
ASPM LevelL0s+L1L0s 配 NVMe 有时会出问题,我遇到过
Native ASPMEnabledWindows 10+ 和较新 Linux 需要
⚠ 注意:有些服务器平台(比如 Intel 至强 C620 系列)的 BIOS 里 ASPM 默认是 Disabled。我曾经在调试一台存储服务器时,功耗高了 15W,就是因为这个开关没打开。

3.2 操作系统配置:策略

BIOS 打开后,操作系统还得知道“要不要用、怎么用”。

3.2.1 Windows 环境

Windows 从 8 开始就内置了 ASPM 支持。但有个坑:它默认只对“未使用”的端口开启 L1,而如果你插着设备在跑,它可能根本不降级。

查看当前状态的命令:

powercfg /q SCHEDULE ASPM

如果没输出,说明没配置。你可以通过组策略或注册表强制启用:

# 注册表路径
HKLM\SYSTEM\CurrentControlSet\Control\Power\PCI\ASPM\Default

# 值 0 = 关闭, 1 = L0s, 2 = L1, 3 = L0s+L1

嗯,这里要提醒:Windows 下 ASPM 经常受电源计划影响。“高性能”计划会禁掉它,“平衡”才会启用。我有个同事调了一整天,最后发现是电源计划没切过来。

3.2.2 Linux 环境

Linux 下检查更直接:

# 查看当前 ASPM 策略
cat /sys/module/pcie_aspm/parameters/policy

# 输出可能是 [default] performance powersave

默认策略是 default,它会沿用 BIOS 的配置。你可以手动切换:

echo powersave > /sys/module/pcie_aspm/parameters/policy

如果想重启也生效,加到 /etc/default/grub 的 GRUB_CMDLINE_LINUX 里:

pcie_aspm=force

为什么加 force?因为有些 BIOS 虽然支持 ASPM,但 ACPI 表里没声明,Linux 会出于兼容性考虑跳过。加了这个参数,内核就不管 ACPI 了,直接按硬件能力启用。我在调试国产平台时经常用它。

💡 小技巧:用 lspci -vv -s 00:1c.0 | grep ASPM 可以看到单个设备实际协商的 L0s/L1 状态。如果显示 ASPM Disabled,说明策略没生效。

3.3 驱动参数:最后一公里

BIOS 和 OS 都配好了,驱动层面也有可能把它关掉。尤其是 NVMe 和网卡驱动,它们有自己的 ASPM 控制位。

3.3.1 NVMe 驱动

Linux NVMe 驱动默认支持 ASPM,但部分老内核需要手动开:

# 模块参数
modprobe nvme_core default_ps_max_latency_us=100

# 或者运行时调整
echo 100 > /sys/class/nvme/nvme0/device/power/control

注意:default_ps_max_latency_us 是延迟容忍度,越小越容易进 L1。如果设得太低,可能导致设备退出不及时,影响性能。我在客户现场设成 50us,结果 4K 随机读延迟从 20us 飙升到 200us……教训深刻。

3.3.2 有线网卡(Intel i210 / i350)

部分网卡驱动的 ASPM 默认就是关闭的。你需要手动打开:

# ethtool
ethtool --set-priv-flags eth0 aspm_l1  on

哦对,Windows 下网卡驱动的电源管理选项卡里,有个“允许计算机关闭此设备以节约电源”,不是 ASPM,别搞混。

3.3.3 Wi-Fi 网卡

Wi-Fi 卡对 ASPM 很敏感,开不好就断流。我建议:

  • 先查驱动文档,确认 ASPM 支持等级
  • 在 /etc/modprobe.d/ 里加 options iwlwifi power_save=1
  • 如果出现掉线,把 power_save 改回 0,只保留 PCIe 层面的 ASPM
关键原则:所有驱动参数都必须在设备枚举后生效。如果发现系统启动后 ASPM 没起来,先用 lspci -vv 看状态,再去排查驱动层面。

3.4 全链路配置流程(SVG)

下面这张图总结了从 BIOS 到驱动的完整配置链条。我自己画流程图时就喜欢把这三层的关系捋清楚,排查时一眼就能定位断点。

ASPM 配置:BIOS → 操作系统 → 驱动 BIOS / UEFI ASPM Support = Enabled Native ASPM = Enabled 操作系统策略 Linux: policy = powersave Windows: 电源计划=平衡 设备驱动 NVMe: default_ps_max_latency_us 网卡: ethtool aspm_l1=on 检查点 1:lspci -vv 查看 ASPM 状态是否 Disabled 检查点 2:策略生效 Linux: /sys/module/pcie_aspm/parameters/policy 检查点 3:延迟确认 ethtool -S 或 NVMe smart-log 配置断点排查方向:从上到下,逐层检查 BIOS → 系统 → 驱动

3.5 实战排查清单

最后给一份我经常贴在工位上的排查清单,按顺序走一遍基本能解决 90% 的 ASPM 不生效问题:

  1. 进 BIOS,确认 ASPM 开关和 Native ASPM 都打开。
  2. 进操作系统,用 lspci -vv 看端口的 ASPM 状态。
  3. 如果当前策略是 performance,改成 powersave 或加内核参数 pcie_aspm=force。
  4. 检查驱动:NVMe 看 /sys/class/nvme/nvme0/device/power/control,网卡看 ethtool --show-priv-flags。
  5. 验证功耗:用 powertop 或 intel_pstate 的 debugfs 看 L1 驻留时间。如果 L1 计数一直为 0,说明没进状态。
🔧 常用工具: powertop(Linux)、lspci -vv、ethtool、Windows 下用 powercfg /energy 生成报告。

记住,ASPM 不是“开了就行”。每层都有它的脾气。我这些年碰到的坑,十有八九是 BIOS 里默认关了,或者驱动参数忘了改。希望这份指南能帮你少走弯路。