Как исправить энергопотребление OnePlus 3T на mainline-ядре: разбор
OnePlus 3T, работающий на mainline-ядре, часто воспринимается как образец для экспериментаторов. Это устройство под управлением postmarketOS с Docker и Tailscale поверх — настоящая песочница для энтузиастов. Но однажды владелец заметил, что процессор держится на 70 °C даже в полном покое. Телефон пр

OnePlus 3T, работающий на mainline-ядре, часто воспринимается как образец для экспериментаторов. Это устройство под управлением postmarketOS с Docker и Tailscale поверх — настоящая песочница для энтузиастов. Но однажды владелец заметил, что процессор держится на 70 °C даже в полном покое. Телефон просто лежал на полке, выполняя фоновые задачи, но температура была настолько высокой, что это вызывало беспокойство. Без вентилятора и радиатора такой нагрев — явный признак некорректной работы энергосберегающих механизмов. Разберёмся, почему это произошло и как можно решить проблему.
Когда устройство нагревается без видимой нагрузки, первое, что приходит в голову, — проверить, какие процессы потребляют ресурсы. Однако в этом случае загрузка CPU была менее 5%, что исключало обычную причину. Оставалось предположить, что процессор не переходит в глубокие состояния сна, известные как C-states. Именно они позволяют ядру «засыпать» в простое, снижая частоту и напряжение. Если эти состояния отключены или неправильно настроены, процессор остаётся в активном режиме, потребляя больше энергии и выделяя больше тепла.
Почему процессор не засыпает: отсутствие C-states
На mainline-ядре для OnePlus 3T, как и для многих других устройств, поддержка cpuidle — подсистемы, управляющей состояниями простоя, — может быть не включена по умолчанию. В конфигурации ядра, которую использовал автор, отсутствовала поддержка определённых C-states для процессора Snapdragon 820/821, установленного в OnePlus 3T. Это приводило к тому, что даже в простое процессор работал на повышенной частоте и напряжении, что и вызывало перегрев.
Проблема усугублялась тем, что governor, например performance или interactive, не позволял частоте опускаться до минимальных значений. В итоге телефон потреблял лишние ватты, а батарея разряжалась быстрее, чем должна была. Для устройства, которое часто используется как сервер или для удалённого доступа, это критично.
Как диагностировать проблему: команды и утилиты
Чтобы подтвердить гипотезу, автор использовал стандартные инструменты Linux. Команда cat /sys/devices/system/cpu/cpu0/cpuidle/state/name показывает, какие состояния сна доступны для каждого ядра. В его случае большинство состояний были либо отключены, либо помечены как недоступные. Это был первый тревожный сигнал.
Дополнительно он проверил частоты процессора через cpupower frequency-info. Выяснилось, что процессор работал на частоте около 1,2 ГГц даже в простое, хотя минимальная частота должна быть 307 МГц. Это подтвердило, что governor не позволял снижать частоту, а отсутствие C-states не давало процессору «засыпать». Логи ядра, проверенные через dmesg | grep -i cpuidle, не содержали ошибок, но и не показывали загрузку драйвера cpuidle для конкретных C-states. Это указывало на то, что поддержка не была включена при сборке ядра.
Решение: пересборка ядра с поддержкой C-states
Для исправления ситуации потребовалось пересобрать ядро с правильными параметрами. Ключевым моментом было включение поддержки CONFIGARMCPUIDLE и CONFIGCPUIDLE в конфигурации ядра. Также необходимо было убедиться, что для конкретного SoC доступны все необходимые C-states. Для Snapdragon 820/821 поддерживаются состояния до C4, но их активация требует тщательной настройки, чтобы не вызвать нестабильность.
После пересборки и установки нового ядра автор заметил значительное улучшение. Температура процессора в покое упала с 70 °C до 40–45 °C, что уже приемлемо для устройства без активного охлаждения. Энергопотребление также снизилось: по данным powertop, потребление в простое уменьшилось примерно на 2–3 Вт, что для смартфона является существенным.
Какие C-states включать и почему это важно?
Не все C-states одинаково полезны. Например, состояние C1 — это просто остановка ядра, а C2 и глубже — выключение тактовой частоты и снижение напряжения. Для Snapdragon 820/821 поддерживаются состояния до C4, но их активация требует тщательной настройки, чтобы не вызвать нестабильность. Включение слишком глубоких состояний может привести к задержкам при пробуждении, поэтому важно найти баланс.
В случае автора включение C-states до C2 оказалось достаточным для снижения температуры. Глубокие состояния C3 и C4 могут дать ещё большую экономию, но их использование требует проверки стабильности системы. Рекомендуется начинать с C1 и C2, а затем постепенно добавлять более глубокие состояния, наблюдая за поведением устройства.
Что это значит для пользователей mainline-ядер
Проблема, с которой столкнулся автор, типична для многих устройств, работающих на mainline-ядре. Разработчики ядра часто фокусируются на функциональности, но не всегда уделяют достаточное внимание энергосбережению. Это особенно актуально для смартфонов, где автономность критична.
Если вы используете mainline-ядро на мобильном устройстве, стоит проверить, корректно ли работают C-states. Это можно сделать с помощью приведённых выше команд. Если состояния сна неактивны, вы рискуете столкнуться с перегревом и быстрым разрядом батареи.
Кроме того, эта ситуация подчёркивает важность тестирования энергопотребления при разработке ядер. Проекты вроде postmarketOS активно работают над улучшением поддержки устройств, но вклад энтузиастов, которые сообщают о подобных проблемах и предлагают решения, остаётся ключевым.
Кого затронет эта проблема
В первую очередь это касается владельцев OnePlus 3T и других устройств на Snapdragon 820/821, которые используют mainline-ядро. Однако аналогичные проблемы могут возникать на любых смартфонах и планшетах с mainline-ядром, особенно на старых устройствах, где драйверы и поддержка SoC ещё не полностью оптимизированы.
Для разработчиков и мейнтейнеров ядер эта статья — напоминание о необходимости включать и проверять поддержку cpuidle при сборке. Для обычных пользователей — руководство к действию, если они замечают необоснованный нагрев или быстрый разряд батареи.
Что будет дальше
Автор планирует продолжить эксперименты с mainline-ядром на OnePlus 3T, но теперь с правильной настройкой энергосбережения. Возможно, он поделится дальнейшими наблюдениями в следующих статьях.
В целом, этот случай показывает, что даже после успешного запуска устройства на mainline-ядре остаётся много работы по тонкой настройке. Энергосбережение — одна из самых сложных задач, но её решение значительно улучшает пользовательский опыт.
Как проверить энергопотребление на вашем устройстве
Если вы подозреваете, что ваше устройство на mainline-ядре потребляет слишком много энергии, начните с проверки доступных C-states. Используйте команду cat /sys/devices/system/cpu/cpu0/cpuidle/state/name, чтобы увидеть список состояний. Если там только state0 и state1, это может быть признаком проблемы.
Затем проверьте частоты через cpupower frequency-info. Если минимальная частота не достигается в простое, это также указывает на неправильную настройку governor. В таком случае вам, возможно, придётся пересобрать ядро с включённой поддержкой cpuidle.
Не забывайте также про инструменты вроде powertop, которые показывают потребление энергии в реальном времени. С их помощью можно оценить эффективность изменений после пересборки ядра.
Итог
Проблема перегрева OnePlus 3T на mainline-ядре была решена за счёт включения поддержки C-states в конфигурации ядра. Это снизило температуру на 25–30 °C и уменьшило энергопотребление, что критично для устройств без активного охлаждения. Если вы столкнулись с похожей ситуацией, проверьте настройки cpuidle — возможно, это избавит вас от лишнего тепла и продлит время работы от батареи.