Решаем проблему с 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

Литература

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

13 commentaries to post

  1. Vitaly, может быть стоит опакетить этот скрипт?

  2. На Thinkpad P1 первого поколения тоже работает.

  3. В Lenovo наконец официально признали проблемы с троттлингом ThinkPad’ов под GNU/Linux. Скоро описанный в статье способ будет не нужен ибо они обещают выпустить обновления UEFI BIOS для всех актуальных поколений ThinkPad.

    1. Виталий, а что нибудь слышно от леново об обновлении биоса на предмет решения проблем с тротлингом?

      1. Аппаратное исправление выпустят только для ноутбуков модельной серии 2020 года (см. первое сообщение на 39 странице от сотрудника компании).

        Всем остальным предлагают использовать «программные исправления».

        1. Попытался вытащить схему питания для своего ноута, но у меня даже директории /sys/devices/platform/INT3400:00 нет, а в тех что начинаются на INT3*** нет такого дерева поддиректорий, что указаны в статье. Что может быть не так с моим ноутом?))

          1. INT3400 поддерживается лишь начиная с 7 или 8 поколения процессоров Intel. Какой процессор установлен в вашем ноутбуке?

          2. У меня старенький thinkpad t440p, проц там соответственно 4го поколения

          3. Предыдущие поколения не должны быть подвержены данной проблеме с троттлингом. В них были установлены полноценные процессоры (не U).

      2. На мой взгляд, Lenovo поступили очень нехорошо. Они полтора года убеждали всех на форуме о том, что разработка аппаратного исправления для всех поддерживаемых устройств активно ведётся (даже составляли список моделей) и нужно лишь немного подождать (сообщения сотрудников компании можно найти в указанной выше теме).

        Далее они заявили, что фикс выпущен для некоторых моделей, в числе которых был T490, но другие участники форума — владельцы данных ноутбуков — сообщили, что исправление попросту не работает и ноутбуки всё равно троттлят.

        Спустя полтора года они заявили, что исправление выйдет лишь для устройств модельной серии 2020 года.

Обсуждение закрыто.