Добрый день, уважаемые читатели.
Относительно недавно я приобрел себе ноутбук-трансформер Lenovo Yoga 9 2-in-1.

Опустим достоинства и недостатки данного девайса, в данном случае нас интересует одно - процессор (Intel Core Ultra 7 155H) очень сильно грелся на рядовых задачах. В качестве дистрибутива на тот момент выступал Pop!_OS 22.04 с гномовским окружением. Для понимания масштаба проблемы: при игре в старый добрый Morrowind (напомню - игра от 2001 года рождения) на Balanced режиме производительности процессор начинал греться до 110 градусов. Более того - меньше 90 градусов температура не опускалась в принципе. Очевидно, что подобное поведение меня, мягко говоря, не устраивало - от длительного времяпровождения за горячим ноутбуком руки здоровее не становятся.
Небольшой спойлер - проблема оказалась в драйвере intel_pstate. Если кратко (тут присутствует немного моих домыслов): по сути, на ноутбуке было всего 2 режима производительности - энергосберегающий и производительный. На энергосберегающем режиме ноутбуку недостаточно производительности для ряда задач, на производительном - процессор при любом поводе начинает разогреваться до 110 градусов. Попытка сидеть на Balanced режиме не увенчалась успехом - в зависимости от нагрузки система прыгала между режимами производительности conservative и performance - о чем нам говорил вывод следующей команды в разные моменты времени на Balanced режиме (но только на pop_os, об этом чуть подробнее будет сказано далее)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governorОпустим, задумывалось ли подобное поведение изначально, или же это ошибка в работе драйвера, меня в первую очередь интересовало решение возникшей проблемы и, покопавшись в системе, я перевел intel_pstate в пассивный режим, добавив в grub в строку GRUB_CMDLINE_LINUX_DEFAULT параметр intel_pstate=passive - за счет этого происходит fallback на другой драйвер, в случае debian 13 это intel_cpufreq (на pop_os, если мне память не изменяет, был acpi-cpufreq - в зависимости от системы детали могут отличаться).
Поведение ноутбука на intel_cpufreq меня полностью устроило, и я надолго забыл об этом вопросе.
Однако, я увидел на Хабре статью Linux Tuning для Современного ноутбука с Пассивной Системой Охлаждения - судя по описанию проблемы, автор столкнулся с очень схожей бедой с перегревом процессора, тоже на Lenovo Yoga, тоже с intel_pstate, пусть и на другой модели ноутбука. Однако, в рамках его решения в ход пошло многое - дело дошло даже до настройки TLP. Я не являюсь экспертом в настройке Линукса и не могу, не попробовав его вариант, судить о его достоинствах и недостатках, но уже на этапе первого упоминания TLP у меня возникло четкое понимание - это то, чем я не хотел бы заниматься. Не буду утверждать, что его решение нерабочее - возможно, на его модели ноутбука описанные танцы с бубном были единственным рабочим вариантом, однако, мне захотелось, чтобы по схожему поисковому запросу выдавалось также чуть более простое решение, чем предложенное.
Примечание
Первоначально с проблемой я столкнулся, используя в качестве операционной системы Pop!_OS 22.04. Сейчас же я использую Debian 13. Как было сказано ранее, при переключении драйвера в пассивный режим на Debian в моей системе по-умолчанию включается intel_cpurfreq, на Pop!_OS же был acpi-cpufreq. Так же, помимо вышеизложенного, в принципе есть некоторые другие различия в поведении системы на разных дистрибутивах. Я не буду пытаться восстановить исходное окружение, на котором я столкнулся с проблемой в первый раз, а буду использовать текущее для демонстрации проблемы и возможного решения.
Шаг 1 - Жарим яичницу на ноутбуке
Итак, мы знаем о наличии бед с температурой.
Для начала, посмотрим на нашего героя драйвер в лицо:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
intel_pstateДавайте попробуем воспроизвести нагрузку искусственно и посмотреть, как поведет себя система.
Будем запускать stress на разных режимах производительности
stress --cpu 20 --timeout 60следить за частотой работы процессора
watch -n 0.5 'for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq; do freq=$(( $(cat $cpu)/1000 )); echo "$cpu: ${freq} MHz"; done'и мониторить температуру с помощью
watch -n 1 sensorsПримерные величины приведены в таблице (нас мало интересуют точные значения, скорее поведение системы в целом)
Режим производительности | Максимальная замеченная температура | Температура в среднем | Средняя частота |
|---|---|---|---|
Powersave | 91 | 67 | 2000 MHz |
Balanced | 107 | 70 - 80 | 2000 MHz - 2800 MHz |
Performance | 110 | 90 | 3700 MHz |
(Примечание - есть субъективное ощущение, что на новых ядрах ситуация стала чуть получше. Я не буду восстанавилвать исходное окружение и сравнивать поведение intel_pstate до и после, но, по моим воспоминаниям, стало чуть лучше)
В первую очередь обратим внимание на то, что Balanced режим ведет себя очень непонятно (диапазон я поставил здесь не случайно) - на разных замерах показывает несколько разные результаты. Также, в какой-то момент драйвер может резко сбросить частоту процессора до 2000 MHz, а при запуске stress снова - достаточно резво ее поднять до пиковых значений.
Причина подобного поведения? Есть версия, что Balanced у intel_pstate немного неполноценный, и просто переключается между другими режимами производительности, но тут, признаться, не могу утверждать, банально так как между поведением на pop_os и debian есть некоторые расхождения - у меня есть записи о том, что на pop_os на balanced режиме команда
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governorвыводила разные governor в разные моменты времени, переключаясь между powersave и performance. На Debian же данная команда вегда выводит powersave независимот от выставленного режима - причем, как мы видим по замерам, переключение режимов производительности эффект на систему оказывает несмотря на фиксированный governor. Я не стал разбираться в причинах данного занимательного явления (но gpt и некоторые поиски в интернете указали, что это, в целом, нормально), просто сделаем вид, что разработчики переработали драйвер. Также, далее, к выводу governor я возвращаться не буду, так как, судя по поведению, на моей системе эта настройка буквально ничего не делает.
Как мы видим из замеров, не в powersave режиме процессор стабильно будет сидеть на температуре 80-90 при возникновении любой нагрузки с периодическими выбросами до ~110 градусов. И когда я говорю любой, то именно это я и имею в виду:
запустил sudo apt upgrade - греемся
играем в старенькую игрушку - греемся
компилируем небольшой учебный проектик - греемся
Как можно решить проблему?
Был предпринят ряд попыток настройки thermald, которые, ввиду своей безуспешности, не будут приведены даже в качестве примера (есть даже некоторые програмки, которые генерируют xml конфиг в зависимости от системы - они тоже не справились). Лезть в TLP и подобные вещи очень не хочется.
Итак, нахрапом сконфигурировать intel_pstate не получилось (да и закрадывается мыслишка, что с этим в принципе есть беды). Глубоко копать во внутрянку не хочется, поэтому попробуем отказаться от intel_pstate.
Шаг 2 - Переводим intel_pstate в пассивный режим
Итак, поведение intel_pstate нас не устраивает, как его настраивать - не очень понятно. Возможным решением проблемы является отказ от intel_pstate в качестве scaling_driver в принципе. Давайте это и сделаем.
Поиск по интернету подсказал, что добиться подобного можно, переведя intel_pstate в пассивный режим. Чтобы зафиксировать результат, пропишем это в grub (ну или другом загрузчике в зависимости от используемого дистрибутива).
# Перейдем в /etc/default/grub
vim /etc/default/grub
# Отредактируем следующую строку (если у вас уже есть какие-то нужные вам параметры, то просто добавьте настройку для intel_pstate)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=passive"
# Обновим grub и после перезагрузим ПК
sudo update-grubПосмотрим, что за драйвер работает теперь:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
intel_cpufreqВновь протестируем систему под нагрузкой.
Будем запускать stress на разных режимах производительности
stress --cpu 20 --timeout 60следить за частотой работы процессора
watch -n 0.5 'for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq; do freq=$(( $(cat $cpu)/1000 )); echo "$cpu: ${freq} MHz"; done'и мониторить температуру с помощью
watch -n 1 sensors
Примерные величины приведены в таблице (нас мало интересуют точные значения, скорее поведение системы в целом)
Режим производительности | Максимальная замеченная температура | Температура в среднем | Средняя частота |
|---|---|---|---|
Powersave | 95 | 60 | 2000 MHz |
Balanced | 91 | 70 | 2800 MHz |
Performance | 100 | 79 | 3400 MHz |
На этот раз картина получилась более внятная - средняя температура уже вменяемая, да и Balanced режим производительности ведет себя адекватно, предоставляя некоторое промежуточное состояние между двумя другими режимами производительности.
На всех режимах производительности, в общем, наблюдается следующая картина - в начале идет повышение температуры до некоторого лимита, после чего начинают сбрасываться частоты и отрабатывать вентилятор, и температура сбрасывается до некотого значения, на котором +- фиксируется на время, в течение которого отрабатывает команда stress.
Из нюансов - на Powersave режиме вентилятор начинает отрабатывать поздновато, в результате, пиковая температура может быть даже выше, чем на других режимах производительности.
Заключение
Уже несколько месяцев использую ноутбук с intel_pstate в пассивном режиме - на данный момент нареканий не возникло никаких. Пару раз закрадывалась мысль, что оригинальный драйвер на некоторых сценариях может выдавать лучшие показатели - но температурный режим на intel_pstate меня совершенно не устроил.
Достоинством предложенного решения является то, что оно очень простое и его настройка не занимает много времени. Также, в том случае, если оно чем-то не устраивает - откатиться на использование intel_pstate в качестве драйвера нетрудно.
Удобства ради, продублирую фикс в конце:
# Перейдем в /etc/default/grub
vim /etc/default/grub
# Отредактируем следующую строку (если у вас уже есть какие-то нужные вам параметры, то просто добавьте настройку для intel_pstate)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=passive"
# Обновим grub и после перезагрузим ПК
sudo update-grub
Спасибо за чтение и до новых встреч.
