让桌面 AMD 显卡在 Linux 下进入低功耗状态 (D3cold)

在 Linux 系统中,让桌面 AMD 显卡在空闲时进入如 D3cold 这样的深度睡眠状态,从而显著降低功耗,主要是由 amdgpu 内核驱动程序自动管理的。用户通常不能直接强制显卡进入 D3cold,而是需要确保满足驱动程序自动触发此状态的条件。

重要前提:如果你的 AMD 显卡是系统中唯一或主要的图形处理器,并且正用于驱动你的桌面显示,那么它将无法进入 D3cold 状态,因为它需要保持活动以输出图像。D3cold 通常适用于以下场景:

  • 系统中存在多个GPU(例如,CPU 集成显卡和 AMD 独立显卡),且 AMD 独立显卡当前并非用于显示输出。
  • 显卡用于无头计算 (headless compute) 任务,在空闲时可以深度睡眠。

本文将介绍如何检查 AMD 显卡的电源状态,了解进入 D3cold 的条件,以及相关的故障排除步骤。

理解显卡电源状态

  • D0: 这是显卡的完全活动状态,功耗最高。当显卡正在处理图形渲染、视频播放或计算任务时,会处于此状态。
  • D3cold: 这是一个非常低的功耗状态,显卡在此状态下消耗的电力极少,接近于断电。链接到 PCIe 总线的电源也可能被移除。这是理想的节能状态。

检查当前电源状态

你可以通过 sysfs 文件系统查看显卡的当前电源状态:

  1. 确定显卡标识:
    首先,使用 lspci -k | grep -EA3 'VGA|3D' 找到你的 AMD 显卡,并注意其内核驱动程序是否为 amdgpu
    通常,显卡在 DRM 子系统中的标识为 cardX (例如 card0, card1)。

  2. 查看 power_state:

    1
    cat /sys/class/drm/cardX/device/power_state

    cardX 替换为你的 AMD 显卡的实际标识。输出 D0 表示活动,D3cold 表示已进入深度睡眠。

  3. 查看 runtime_status:

    1
    cat /sys/class/drm/cardX/device/runtime_status

    这个文件显示设备的运行时PM状态,例如 activesuspended。如果显示 suspended,则表示显卡已进入了某个低功耗状态。

进入 D3cold 的条件

要让 amdgpu 驱动程序将显卡置于 D3cold 状态,通常需要满足以下条件:

  1. 显卡完全空闲:

    • 没有任何应用程序(游戏、视频编辑、3D 建模、计算任务等)正在使用该 AMD 显卡。
    • 可以使用 radeontop 工具来监控 AMD 显卡的实时活动情况。如果 GPU 使用率、显存使用率等都很低或为零,则表明它可能处于空闲状态。
  2. 没有活动的显示输出 (针对非主显示GPU):

    • 如果该 AMD 显卡不是当前驱动桌面显示的主要 GPU(例如,你正在使用 CPU 的集成显卡输出桌面,而 AMD 显卡是独立的附加卡),那么连接到此 AMD 显卡的所有显示器接口都必须没有活动信号输出。
  3. 运行时电源管理 (Runtime PM) 已启用:

    • amdgpu 驱动模块的 runpm 参数控制此功能。
    • 检查当前值: cat /sys/module/amdgpu/parameters/runpm
    • 期望值为 -1 (自动,默认) 或 1 (强制启用)。如果为 0,则表示运行时PM被禁用,这会阻止进入 D3cold。通常不需要手动修改此参数,除非用于故障排除。
  4. 最新的系统组件:

    • 内核: 使用较新版本的 Linux 内核,因为 amdgpu 驱动在不断更新和改进电源管理功能。
    • Mesa: 最新的 Mesa 提供了用户空间的 3D 驱动,与内核驱动协同工作。
    • linux-firmware: 这个包含 AMD 显卡微码的包必须是最新版本,因为固件对电源管理至关重要。
  5. BIOS/UEFI 支持与配置:

    • 主板的 BIOS/UEFI 必须正确支持 ACPI,并且相关的 PCIe 电源管理设置(如 ASPM - Active State Power Management)可能需要配置得当。
    • 确保 BIOS 中没有禁用独立显卡深度睡眠的选项。

故障排除:显卡无法进入 D3cold

如果你的 AMD 显卡始终停留在 D0 状态,即使你认为它应该空闲:

  1. 仔细核对上述所有条件:特别是显卡是否真的完全空闲,以及 runpm 参数是否正确。
  2. 检查内核日志:
    1
    2
    sudo dmesg | grep amdgpu
    sudo dmesg | grep drm
    留意任何与 amdgpu 或 DRM 相关的错误、警告信息,它们可能揭示电源管理失败的原因。
  3. 确保没有意外的软件占用: 某些后台服务或配置不当的桌面组件有时可能会无意中保持对显卡的占用。

其他可能相关的机制 (较旧或高级)

以下方法在历史上或特定高级场景下可能与显卡电源控制有关,但对于现代 amdgpu 驱动自动管理 D3cold 而言,并非首选:

  • vgaswitcheroo:

    • 一个较旧的内核接口,用于在多个显卡之间切换,并能尝试关闭未使用的显卡。
    • 路径: /sys/kernel/debug/vgaswitcheroo/switch (如果存在)。
    • 在现代系统中,其功能很大程度上已被 amdgpu 驱动的运行时PM和PRIME机制取代,主要用于较老的硬件或特定配置。
  • ACPI 调用 (acpi_call):

    • 这是一个高级工具,允许直接调用 ACPI 方法。理论上,如果硬件的 ACPI 表中定义了关闭显卡电源的方法,可以通过 acpi_call 调用。
    • 风险极高:不正确的 ACPI 调用可能导致系统不稳定甚至硬件损坏。这需要对特定硬件的 ACPI 实现有深入了解,不建议普通用户尝试。

总结

让桌面 AMD 显卡在 Linux 下进入 D3cold 低功耗状态,主要依赖于 amdgpu 驱动程序的自动运行时电源管理。用户的核心任务是创造满足驱动程序自动触发这些节能特性的条件,特别是确保显卡真正空闲且系统配置(内核、固件、BIOS)得当。直接手动控制进入 D3cold 通常是不可行也不被推荐的。


让桌面 AMD 显卡在 Linux 下进入低功耗状态 (D3cold)
https://blog.yonagi.top/2025/06/04/ff8f6939324b/
作者
Yonagi
发布于
2025年6月4日
许可协议