Включаем ASPM

Повышенный нагрев PCIe устройств в ПК – не самая приятная вещь. Особенно в тех случаях, когда нагрев приводит к троттлингу. Недавно я заметил, что некоторые устройства у меня нагреваются даже в состоянии “покоя”, что навело на мысли о проблемах с настройками энергосбережения.

В этой заметке – мои шаги для включения Active-state power management (ASPM). Этот механизм позволяет PCIe устройствам снижать потребление энергии по указанию от ОС.

Отдельно отмечу, что некоторые производители материнских плат отключают управление ASPM для ОС. В моём случае (с MSI) потребовалось принудительно установить параметр BIOS под названием ASPM Control for CPU PCIe в состояние L0s And L1 Entry.

В ОС воспользуемся командой lspci, чтобы проверить поддержку ASPM у устройств

$ sudo lspci -vv | grep 'LnkCtl:'

LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
LnkCtl: ASPM Disabled; Disabled- CommClk+
LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+

Если большинство строк в выводе имеют Disabled, а не Enabled, то стоит дать ядру Linux явное указание к сохранению энергии путём установки флагов CMDLINE.

Но сначала проверим поддержку ASPM у ядра.

$ sudo journalctl -b | grep 'ASPM'

kernel: acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3]

Хорошо, тут видно, что OS поддерживает ASPM. Проверим, какая политика ASPM установлена сейчас.

$ cat /sys/module/pcie_aspm/parameters/policy

[default] performance powersave powersupersave

default – по умолчанию, стоит внести ясность и явно включить режим powersave.

Отредактируем конфигурацию GRUB и внесём релевантную опцию загрузки в CMDLINE.

$ sudoedit /etc/default/grub

Нужно только добавить pcie_aspm.policy=powersave в конец строки с CMDLINE.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noresume pcie_aspm.policy=powersave"

Теперь запустим обновление конфигурации GRUB, чтобы он “увидел” изменение CMDLINE.

$ sudo update-grub

Перезагружаемся. После перезагрузки проверяем CMDLINE.

$ sudo journalctl -b | grep 'Kernel command line'

kernel: Kernel command line: [...] pcie_aspm.policy=powersave

Здесь видим, что новая опция передана ядру, отлично! Проверим политику ASPM.

$ cat /sys/module/pcie_aspm/parameters/policy

default performance [powersave] powersupersave

И новая политика тоже заработала. Финальный аккорд – проверяем состояние PCIe.

$ sudo lspci -vv | grep 'LnkCtl:'

LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
LnkCtl: ASPM L0s L1 Enabled; Disabled- CommClk+
LnkCtl: ASPM L1 Enabled; RCB 64 bytes, Disabled- CommClk+

Как видно, часть устройств теперь имеют включенный ASPM, но не все, что нормально. Для корректной работы ASPM нужна поддержка не только от ОС, но и от железа.

В моём случае, я увидел явное снижение температур в простое для самых энергоёмких устройств, чего и хотел добиться.

Если Вы хотите обсудить содержание заметки, задать вопросы или предложить изменения, то со мной можно связаться в Telegram