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 Support | Enabled / Auto | 关闭后全链路失效 |
| ASPM Level | L0s+L1 | L0s 配 NVMe 有时会出问题,我遇到过 |
| Native ASPM | Enabled | Windows 10+ 和较新 Linux 需要 |
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
lspci -vv 看状态,再去排查驱动层面。
3.4 全链路配置流程(SVG)
下面这张图总结了从 BIOS 到驱动的完整配置链条。我自己画流程图时就喜欢把这三层的关系捋清楚,排查时一眼就能定位断点。
3.5 实战排查清单
最后给一份我经常贴在工位上的排查清单,按顺序走一遍基本能解决 90% 的 ASPM 不生效问题:
- 进 BIOS,确认 ASPM 开关和 Native ASPM 都打开。
- 进操作系统,用
lspci -vv看端口的 ASPM 状态。 - 如果当前策略是
performance,改成powersave或加内核参数pcie_aspm=force。 - 检查驱动:NVMe 看
/sys/class/nvme/nvme0/device/power/control,网卡看ethtool --show-priv-flags。 - 验证功耗:用 powertop 或 intel_pstate 的 debugfs 看 L1 驻留时间。如果 L1 计数一直为 0,说明没进状态。
powertop(Linux)、lspci -vv、ethtool、Windows 下用 powercfg /energy 生成报告。
记住,ASPM 不是“开了就行”。每层都有它的脾气。我这些年碰到的坑,十有八九是 BIOS 里默认关了,或者驱动参数忘了改。希望这份指南能帮你少走弯路。