ZaLinux.ru

Андервольтинг в Linux центрального процессора (CPU)

Для Linux отсутствует официальная программа для андервольтинга, поэтому энтузиасты методами обратной инженерии нашли способы менять напряжение на процессоре и создали свои собственные утилиты.

Информация об андервольтинге в Linux (на английском языке): https://github.com/mihic/linux-intel-undervolt

Утилиты для андервольтинга в Linux:

Я покажу как сделать андервольтинг в Linux на примере intel-undervolt, эта утилита написана на C (две другие это скрипты Python и Bash).

Андервольтинг с intel-undervolt

Установим программу:

git clone https://github.com/kitsunyan/intel-undervolt
cd intel-undervolt/
./configure --enable-systemd --enable-openrc
make
sudo make install
sudo systemctl daemon-reload

Использование программы:

intel-undervolt РЕЖИМ [ОПЦИИ]...

В качестве РЕЖИМА может быть:

  read                     Прочитать и отобразить текущие значения
  apply                    Применить значения из конфигурационного файла
  measure                  Измерить потребление энергии
    -f, --format <формат>  Формат вывода (terminal, csv)
    -s, --sleep <интервал> Интервал сна в секундах
  daemon                   Запустить в режиме службы

Прочитаем текущие значения:

sudo intel-undervolt read

В данный момент у меня настройки по умолчанию:

CPU (0): -0.00 mV
GPU (1): -0.00 mV
CPU Cache (2): -0.00 mV
System Agent (3): -0.00 mV
Analog I/O (4): -0.00 mV

Я установлю бенчмарк производительности центрального процессора для Linux.

Запущу его на 5 минут, с нагрузкой на все 12 ядер (по ссылке в статье описание опций):

sysbench cpu --threads=12 --time=300 run

Мой текущий результат без андервольтинга:

Настройка андервольтинга в intel-undervolt

Для настройки intel-undervolt нужно изменить значения в конфигурационном файле /etc/intel-undervolt.conf:

sudo gedit /etc/intel-undervolt.conf

По умолчанию там содержится следующее:

# Включение или отключение триггеров (elogind)
# Использование: enable [yes/no]

enable no

# CPU андервольтинг
# Использование: undervolt ${index} ${display_name} ${undervolt_value}
# Пример: undervolt 2 'CPU Cache' -25.84

undervolt 0 'CPU' 0
undervolt 1 'GPU' 0
undervolt 2 'CPU Cache' 0
undervolt 3 'System Agent' 0
undervolt 4 'Analog I/O' 0

# Изменение лимитов мощности
# Использование: power ${domain} ${short_power_value} ${long_power_value}
# Значение мощности: ${power}[/${time_window}][:enabled][:disabled]
# Домены: package
# Пример: power package 45 35
# Пример: power package 45/0.002 35/28
# Пример: power package 45/0.002:disabled 35/28:enabled

# Изменение сдвига критической температуры
# Использование: tjoffset ${temperature_offset}
# Пример: tjoffset -20

# Переключатель настроек между энергией в сравнении с производительностью
# Использование: hwphint ${mode} ${algorithm} ${load_hint} ${normal_hint}
# Подсказки: смотрите energy_performance_available_preferences
# Режимы: switch, force
# Алгоритмы нагрузки: load:${capture}:${threshold}
# Алгоритмы мощности: power[:${domain}:[gt/lt]:${value}[:[and/or]]...]
# Захват: single, multi
# Порог: Порог использования CPU
# Домен: RAPL power domain, проверка с `intel-undervolt measure`
# Пример: hwphint force load:single:0.8 performance balance_performance
# Пример: hwphint switch power:core:gt:8 performance balance_performance

# Интервал обновления демона
# Использование: interval ${interval_in_milliseconds}

interval 5000

# Действия демона
# Использование: daemon действие[:опция...]
# Действия: undervolt, power, tjoffset
# Опции: once

daemon undervolt:once
daemon power
daemon tjoffset

Для применения настроек андервольтинга используется синтаксис: apply ${index} ${display_name} ${undervolt_value}.

Здесь: apply — команда для применения настроек, ${index} — номер настройки, которую мы применяем, ${undervolt_value} — значение андервольтинга.

В качестве ${index} может быть:

  • 0 — CPU (то есть центральный процессор)
  • 1 — GPU (то есть видео ядро центрального процессора)
  • 2 — CPU Cache (то есть кэш центрального процессора)
  • 3 — System Agent
  • 4 — Analog I/O

Например:

apply 2 'CPU Cache' -25.84

означает андервольтинг кэша CPU на 25.84 mV.

Ограничение мощности

Здесь можно указать свои значения для TDP.

TDP для процессоров имеет значение на короткое время турбобуста и на длительное время турбобуста. Продолжительность обоих промежутков турбобуста также можно отрегулировать.

Поддерживается два варианта синтаксиса:

power package ${short_term} ${long_term}
power package ${short_term}/${time_window} ${long_term}/${time_window}

Здесь:

  • ${short_term} — предельная мощность на тот период ТурбоБуста, когда ему разрешено выходить за границы обычного ТрубоБуста
  • ${long_term} — предельная мощность «обычного» ТурбоБуста
  • ${time_window} — продолжительность данного отрезка обычного ТурбоБуста или короткого «супер» ТурбоБуста

Пример:

power package 35/5 25/60

В нём устанавливается значение TDP на 35 когда турбобусту разрешено выйти за пределы обычного турбобуста, при этом продолжительность этого отрезка 5 секунд. Значение «обычного» турбобуста установлено на 25, причём его продолжительность 60 секунд.

Необязательно указывать время короткого и долгого турбобуста, можно использовать следующий синтаксис, только со значениями TDP:

power package 35 25

В этом случае будут использоваться дефолтные интервалы времени.

Лимит температуры

Вы можете установить предел температуры, после которого начинается термальный троттлинг. Температура указывается в виде значения смещения от максимального температурного уровня. Допустим установлено:

tjoffset -20

Если максимальный температурный уровень установлен на 100, то результирующий лимит будет 100 - 20 = 80°C. Помните, что сдвиг более чем 15°C разрешён только в Skylake и более новых.

Применение настроек

После того, как вы изменили файл /etc/intel-undervolt.conf, чтобы настройки вступили в силу, нужно выполнить

sudo intel-undervolt apply

Программе нужны права рут. Вы можете применять ваши настройки автоматически, включив службу intel-undervolt.service.

Режим службы

Иногда лимиты мощности и температуры могут быть сброшены EC, BIOS или чем-то ещё. Это поведение можно подавить, периодично применяя настройки лимитов. intel-undervolt-loop.service позволяет вам запустить эту программу в режиме службы, которая с определённым интервалом будет применять настройки. Интервал можно изменить поменяв значение interval:

interval 5000

Это значение в миллисекундах, по умолчанию установлено на 5 секунд.

Тесты андервольтинга в Linux

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

sysbench cpu --threads=12 --time=300 run

Новое значение:

В первый раз я получил:

  • CPU скорость: событий в секунду: 9065.31
  • Общая статистика: общее количество событий: 2719621

Событием в этой программе бенчмаркинга называют количество проделанных операций.

Во второй раз я получил:

  • CPU скорость: событий в секунду: 12486.27
  • Общая статистика: общее количество событий: 3745908

Прирост производительности 12486.27 / 9065.31 * 100% = 137,73%, то есть на 37 процентов.

В Windows у меня в Hashcat увеличилась производительность при переборе паролей Wi-Fi на центральном процессоре с 16995 H/s до 19850 H/s.

19850 / 16995 * 100% = 116,8%, то есть на 16 процентов.

Как можно убедиться, прирост действительно есть. Причём чем дольше работает процессор на максимальной частоте, тем больше выигрыш в мощности по сравнению со стандартными настройками.

Примечание: я также сильно увеличил TDP, не делайте так, если не уверены. В моём случае после снижения напряжения троттлинг из-за превышения TDP практически не наступает (процессору хватает дефолтного TDP), поэтому эта настройка вообще мало на что влияет + справляется охлаждение. Вы этой настройкой можете довести свой процессор до крайней температуры — без стресс-тестов с контролем температуры не меняйте это значение. Если у вас имеет место термальный троттлинг (из-за перегрева) — вообще не меняйте эту настройку в сторону увеличения! В этом случае вы сделаете сильно хуже и появляются реальные перспективы «спалить» процессор.

Запуск службы intel-undervolt

Для запуска службы intel-undervolt применяется команда:

sudo systemctl start intel-undervolt

Для остановки:

sudo systemctl stop intel-undervolt

Для проверки статуса:

systemctl status intel-undervolt

После перезагрузки служба не будет запущена. Для этого её нужно добавить в автозагрузку командой:

sudo systemctl enable intel-undervolt

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

О том, как контролировать текущую частоту и температуру процессора в Linux смотрите здесь.

Рекомендуемые статьи:

Оставить комментарий

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