Решаем проблему с throttling на ноутбуках ThinkPad

В данном HOWTO мы подробно рассмотрим возможность исправления принудительного снижения частоты процессора из-за перегрева в ноутбуках ThinkPad.

Введение

Ноутбуки Lenovo ThinkPad T-серии корректно работают под GNU/Linux (при наличии ядра не ниже версии 4.20), однако имеют ряд проблем с принудительным снижением производительности.

Из-за неправильного указания в прошивке устройства лимита, температура первой ступени троттлинга под данной ОС составляет всего 70 градусов Цельсия, что очень мало и не даёт устройству, особенно оснащённому процессором класса Intel Core i7, проявить свои возможности. Под Windows же лимит составляет 90 градусов ибо корректируется на этапе загрузки соответствующим драйвером.

Уже достаточно давно существует «грязный хак» для данных устройств, который каждые 60 секунд перезаписывает содержимое таблиц ACPI, но это далеко не лучшее решение, к тому же требующее отключения технологии UEFI Secure Boot.

Существует и более правильный способ — сделать как в Windows — при загрузке системы указывать правильную схему электропитания устройства.

Поиск доступных схем питания

Определим доступные схемы электропитания устройства, поддерживаемые модулем ядра int3400:

cat /sys/devices/platform/INT3400:00/uuids/available_uuids

Скорее всего, будут выданы следующие стандартные для платформы Intel GUID:

  • 63BE270F-1C11-48FD-A6F7-3AF253FF3E2 (adaptive performance — «сбалансированный» (используется в ОС Windows по умолчанию));
  • 3A95C389-E4B8-4629-A526-C52C88626BAE (active — «максимальная производительность»);
  • 9E04115A-AE87-4D1C-9500-0F3E340BFE75 (passive — «энергосбережение»).

Определим текущую активную схему:

cat /sys/devices/platform/INT3400:00/uuids/current_uuid

Если ответ на эту команду INVALID, значит устройство подвержено багу с неправильным указанием схемы прошивкой.

Определим какой зоной охлаждения управляет модуль ядра int3400:

grep INT3400 /sys/class/thermal/thermal_zone*/type

Скорее всего, это будет thermal_zone1, но на разных устройствах конфигурации могут значительно отличаться.

Определим текущие параметры троттлинга:

sudo rdmsr -f 29:24 -d 0x1a2

На ноутбуке ThinkPad T480 это значение равно 30, на T580 — 20.

Установка правильной схемы питания

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

Переключимся в режим суперпользователя, т.к. все команды должны выполняться с повышенными привилегиями:

sudo -i

Установим сбалансированную схему энергосбережения процессора:

echo 63BE270F-1C11-48FD-A6F7-3AF253FF3E2D > /sys/devices/platform/INT3400:00/uuids/current_uuid

Задействуем правильную зону охлаждения:

echo enabled > /sys/class/thermal/thermal_zone1/mode

Проверим изменения в параметрах троттлинга:

rdmsr -f 29:24 -d 0x1a2

Если всё сделано верно, то предыдущее полученное значение уменьшится в 10 раз (если было 30, то должно быть 3). В противном случае следует выбрать другую схему энергосбережения и параметры системы охлаждения, либо указать их правильно.

Автоматизируем установку темы при загрузке

Описанные выше действия не сохраняются между перезагрузками системы, поэтому создадим специальный скрипт, а также systemd-юнит, который будет выполнять их в автоматическом режиме.

Создадим скрипт, установим ему правильный chmod и контекст безопасности SELinux:

sudo touch /usr/local/bin/throttling-fix
sudo chown root:root /usr/local/bin/throttling-fix
sudo chmod 0755 /usr/local/bin/throttling-fix
sudo restorecon -v /usr/local/bin/throttling-fix
sudoedit /usr/local/bin/throttling-fix

Листинг файла /usr/local/bin/throttling-fix (значения GUID схемы, а также термальной зоны следует заменить на необходимые для конкретного устройства):

#!/usr/bin/bash
set -e

echo 63BE270F-1C11-48FD-A6F7-3AF253FF3E2D > /sys/devices/platform/INT3400:00/uuids/current_uuid
echo enabled > /sys/class/thermal/thermal_zone1/mode

Создадим systemd-юнит для автоматического запуска:

sudo touch /etc/systemd/system/throttling-fix.service
sudo chown root:root /etc/systemd/system/throttling-fix.service
sudo chmod 0644 /etc/systemd/system/throttling-fix.service
sudo restorecon -v /etc/systemd/system/throttling-fix.service
sudoedit /etc/systemd/system/throttling-fix.service

Листинг файла /etc/systemd/system/throttling-fix.service:

[Unit]
Description=ThinkPad throttling fix
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/throttling-fix
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Активируем юнит для автоматического запуска:

sudo systemctl enable --now throttling-fix.service

Литература

При написании данной статьи использовалась литература из следующих источников:

4 комментария к записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *