Ноутбук, который гудит кулерами под нагрузкой и прогревается до 90-95 градусов, почти всегда имеет запас, о котором производитель умалчивает. Напряжение на процессор подаётся с расчётом на самый неудачный экземпляр партии, и у большинства чипов этот запас измеряется десятками милливольт. Андервольтинг забирает его обратно: система держит те же частоты, потребляет меньше ватт, греется слабее и реже упирается в троттлинг. Всё делается из консоли, без разборки корпуса и паяльника, а главное, обратимо, потому что смещения напряжения живут в регистрах процессора только до перезагрузки. Ниже описано, как устроен механизм, какие утилиты доступны в Linux и как найти безопасный предел, не потеряв стабильность.
Связь напряжения, частоты и тепловыделения в цифрах
Динамическая часть энергопотребления кремния растёт примерно пропорционально квадрату напряжения и линейно от частоты, поэтому даже небольшое снижение вольтажа даёт заметный выигрыш. Пример в лоб. Ядро под нагрузкой питается напряжением 1,15 В, андервольт в 75 мВ опускает его до 1,075 В. Падение вольтажа на 6,5 процента уменьшает динамическое потребление примерно на 13 процентов. Для мобильного чипа, который в стресс-тесте съедает 25-30 Вт, это экономия в 2-4 Вт, и статическая часть, зависящая от напряжения и температуры напрямую, тоже проседает вниз.
Для владельца ноутбука эти ватты конвертируются в две осязаемые вещи. Температура под длительной нагрузкой обычно опускается на 5-15 градусов, сколько именно, зависит от удачи конкретного экземпляра. И система реже пересекает пороги, на которых кривая вентиляторов раскручивает крыльчатку до раздражающих оборотов, поэтому ноутбук замолкает там, где раньше шумел постоянным фоном.
Сюда же ложится понятие TjMax, максимальной температуры кристалла. У большинства мобильных процессоров Intel она равна 100 градусам, и при её достижении срабатывает троттлинг: контроллер сбрасывает частоты, вплоть до пропуска тактов. Горячий ноутбук под нагрузкой сначала теряет герцы, а потом уже нервы владельца, и андервольт отодвигает точку, в которой это начинается.
Остаётся вопрос, откуда в процессоре лишние милливольты. Одна модель продаётся миллионами экземпляров, каждый кристалл чуть отличается по утечкам, а напряжение назначается по худшему случаю, с запасом на деградацию за годы службы. Индивидуальная подстройка просто подгоняет питание под конкретный кусок кремния, а не под средний образец. По этой причине предел у каждого процессора свой и ищется только экспериментом.
Инструменты андервольтинга в Linux и границы применимости
Основной инструмент для Intel называется intel-undervolt. Утилита работает с процессорами начиная с Haswell, то есть с четвёртого поколения архитектуры Core 2013 года, и использует модельный регистр MSR 0x150, тот же канал, через который Windows-аналог ThrottleStop меняет напряжения. Плиты повторяют ThrottleStop: CPU Core, Intel GPU, CPU Cache, System Agent и Analog I/O. Смещения задаются в милливольтах, хотя физическая сетка регистра грубее, один шаг равен 1/1024 В, утилита переводит значения сама.
На Arch-подобных системах проект ставится из AUR одноимённым пакетом, на Debian, Ubuntu и Fedora собирается из исходников классической связкой:
./configure --enable-systemd
make
sudo make install
Набор команд компактный. Команда intel-undervolt read показывает текущие смещения всех плит, intel-undervolt apply применяет значения из файла /etc/intel-undervolt.conf, intel-undervolt measure в интерактивном режиме рисует потребление и температуры по доменам, для него нужен загруженный модуль intel_rapl.
С AMD ситуация другая, и сказать об этом надо сразу. На современных Ryzen сменить напряжение из операционной системы тем же способом нельзя, производитель закрыл канал после истории с уязвимостью Plundervolt. Рабочий путь на новых поколениях один: PBO Curve Optimizer в BIOS. Для старых Zen первого и второго поколения существуют утилиты amdctl и ZenStates, правящие таблицы P-states. Дальше в статье речь только про Intel, потому что именно там консольный андервольтинг жив и доступен.
С Plundervolt связана важная деталь. В конце 2019 года исследователи показали, что занижение напряжения позволяет вызвать ошибки в защищённых вычислениях Intel SGX и вытащить из них секреты, уязвимости присвоен номер CVE-2019-11157, а база NVD описывает её как неправильную проверку условий в настройках напряжения некоторых процессоров Intel. После этого микрокод и BIOS получили возможность блокировать изменение напряжения из операционной системы. На многих ноутбуках, особенно с чипами десятого поколения и новее, в UEFI появился пункт вида "Undervolt Protection", и на закрытых машинах смещения просто не применяются. Проверка занимает полминуты: применили значения, прочитали обратно, увидели нули, значит, машину заблокировали на уровне прошивки.
Подготовка ядра и замер базовой температуры до вмешательства
Прежде чем трогать напряжения, системе нужно разрешить доступ к регистрам. Драйвер msr по умолчанию не загружен и создаёт устройства /dev/cpu/N/msr после команды в терминале:
sudo modprobe msr
С ядра 5.9 у драйвера появился параметр allow_writes с тремя значениями. В режиме по умолчанию запись разрешена, но раз в 30 секунд в журнал сыплется предупреждение, а системе ставится пометка tainted флагом CPU_OUT_OF_SPEC. Значение off полностью запрещает запись ошибкой EPERM, значение on делает всё тихо. Для чистоты журнала разумно включить on через загрузчик. В файле /etc/default/grub строка с параметрами выглядит так:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash msr.allow_writes=on"
После правки конфиг загрузчика пересобирается: update-grub в Debian и Ubuntu, grub-mkconfig -o /boot/grub/grub.cfg в Arch, grub2-mkconfig -o /boot/grub2/grub.cfg в Fedora. Одна оговорка важнее остальных. Если в UEFI включён Secure Boot, ядро работает в режиме lockdown, и любая запись в MSR возвращает Operation not permitted ещё на уровне проверки, до всяких предупреждений. Выход один: отключить Secure Boot в настройках прошивки, обычно это раздел Security или Boot.
Теперь замер базы, без него весь дальнейший поиск предела слепой. За температуры отвечает набор lm-sensors:
sudo sensors-detect
sensors | grep -i package
Примерный вывод второй команды выглядит так: Package id 0: +87.0°C (high = +84.0°C, crit = +100.0°C). За частоты, потребление и температуру корпуса одновременно отвечает turbostat, на Debian и Ubuntu он живёт в пакетах linux-tools-common и linux-tools-generic, в Fedora в пакете kernel-tools:
sudo turbostat --quiet --interval 5 --show Bzy_MHz,PkgTmp,PkgWatt
Запустив десятиминутный стресс-тест и глянув на цифры, владелец получает точку отсчёта: такая частота, такой ваттаж, такая температура.
Первый андервольт через конфиг intel-undervolt
Вся настройка живёт в файле /etc/intel-undervolt.conf. Строка описывается схемой: индекс плиты, её имя, смещение в милливольтах. Разумный первый профиль выглядит так:
undervolt 0 'CPU' -50.00
undervolt 1 'GPU' -50.00
undervolt 2 'CPU Cache' -50.00
undervolt 3 'System Agent' 0
undervolt 4 'Analog I/O' 0
Значение -50.00 означает минус 50 милливольт для ядра процессора. Домены System Agent и Analog I/O в первый день трогать не нужно, их вклад в нагрев мал.
Есть нюанс, на котором спотыкаются почти все новички. На части моделей плиты CPU Core и CPU Cache физически сидят на одной линии питания, и процессор использует большее из двух назначенных напряжений. Сместить ядро на минус 100, а кэш оставить на нуле значит не получить от ядра ничего. Поэтому индексы 0 и 2 держат одинаковыми и двигают их синхронно.
Применение и проверка занимают две команды:
sudo intel-undervolt apply
sudo intel-undervolt read
Первая пишет смещения в регистр, вторая читает их обратно. Если прочитанное совпало с конфигом, чип принял значения, и turbostat через минуту покажет снижение ваттажа под той же нагрузкой. Дальше начинается медленная часть: шаги по 25 мВ с проверкой после каждого. У большинства экземпляров безопасная граница лежит между 75 и 125 мВ, глубже 150 мВ уходят только удачные кристаллы. Игрокам и монтажёрам отдельно интересна плита GPU, её смещение охлаждает интегрированную графику в играх.
В том же конфиге есть и другие рычаги. Строка power package 35 25 ставит лимиты потребления пакета: 35 Вт кратковременно, 25 Вт в длительной перспективе, окна времени задаются в формате 35/5 25/60. Строка tjoffset -10 опускает потолок троттлинга со 100 до 90 градусов, что звучит странно, но на практике делает ноутбук тише, потому что кулеры получают инструкцию не гнать процессор до самого предела. Смещения свыше 15 градусов принимают только процессоры Skylake и новее.
Проверка стабильности и поиск безопасного предела
Андервольт, как и разгон, проверяется нагрузкой, только в обратную сторону: вместо жажды стабильности на максимум частоты здесь ищется граница, за которой кремний начинает ошибаться. Симптомы перебора типовые: приложение падает без причины, браузер теряет вкладки, система замирает намертво или уходит во внезапную перезагрузку, а в журнале ядра появляются записи о machine check. Физической опасности в этом нет, напряжение ниже штатного, регистр сбрасывается при перезагрузке, но несохранённый документ в момент зависания никто не вернёт. Поэтому к проверке подходить серьёзно и вести её по одной схеме:
- Сохранить все документы и закрыть лишние программы, чтобы сбой не стоил несохранённых изменений;
- Прогнать синтетический стресс-тест на 20-30 минут, например утилитой stress-ng, она есть в репозиториях всех крупных дистрибутивов;
- Параллельно следить за температурами и частотами в утилите s-tui или в выводе sensors и turbostat;
- После теста проверить журнал ядра на записи о machine check и убедиться, что ошибок нет;
- Добавить реальную нагрузку вроде сборки проекта или кодирования видео, синтетика ловит не все паттерны вычислений;
- При любом сбое откатиться на 25-50 мВ назад и повторить цикл.
Команды из пунктов, готовые к копированию, выполняются в обычном терминале:
stress-ng --cpu $(nproc) --cpu-method matrixprod --timeout 30m --metrics-brief
sudo journalctl -k | grep -iE "mce|machine check"
Практика добавляет два наблюдения. Первое: нестабильность иногда проявляется не сразу, а на второй-третий день, в редких сценариях, поэтому найденный предел обычно сдвигают на 10-20 мВ мягче и живут с профилем неделю. Второе: ошибка вычислений может испортить результаты без единого падения, редкий, но реальный случай, и запас в пару десятков милливольт обходится дешевле, чем битый архив.
Автозагрузка профиля и сервисы intel-undervolt в systemd
Смещения в MSR волатильны, перезагрузка обнуляет их. Решение встроено в проект: при сборке с флагом --enable-systemd в систему ставится юнит, который применяет /etc/intel-undervolt.conf автоматически:
sudo systemctl enable --now intel-undervolt.service
В комплекте есть и второй юнит, intel-undervolt-loop, который повторяет применение настроек раз в interval миллисекунд, по умолчанию каждые 5000. Зачем это нужно: встроенный контроллер или прошивка могут сбрасывать лимиты потребления на лету, и периодическое повторение удерживает их на заданных значениях.
Экономию батареи проверяют до и после на одном сценарии: час чтения с Wi-Fi или один и тот же фильм. Утилита powertop в разделе с разрядом показывает текущие ватты, типичный итог андервольта под смешанной нагрузкой составляет единицы ватт, что на ноутбуке с батареей 50 Втч выливается в десятки минут автономности. Тут нет чудес, чистая арифметика: меньший вольтаж при тех же герцах тратит меньше энергии.
Когда андервольтинг не поможет и что сделать сначала
Есть машины, где вечер с конфигами ничего не даст. Первая группа уже описана: UEFI с защитой от изменения напряжения, типичная для бизнес-линеек последних поколений, на них смещения не применяются, и путь лежит через прошивку, если производитель оставил переключатель. Вторая группа, десктопы и серверы с нормальным охлаждением: радиатору есть куда дуть, и выигрыш от пары градусов в шуме не услышать.
Отдельно про старые ноутбуки, которые греются даже в простое. Андервольт не заменяет обслуживание: забитый пылью радиатор и высохшая термопаста дают больше градусов, чем забирает любой профиль напряжения, и чистка системы охлаждения идёт первой. Смещение затем честно покажет, сколько тепла производит сам чип.
Итог у этой технологии скромный и честный. Она не делает ноутбук быстрее, она делает его спокойнее: те же частоты при меньшем нагреве, ниже обороты кулеров, дольше батарея, меньше троттлинга в тонком корпусе. Ценой становится один вечер на поиск предела и полсотни милливольт осторожности. Начинать разумно с минус 50 мВ на трёх основных плитах, двигаться шагами по 25, записывать температуры и не спешить: процессор сам покажет границу, надо лишь слушать его сбоями и журналами.