Бережём электроэнергию с Intel P State

()

Начиная с семейства Sandy Bridge в процессорах Intel присутствует новая система управления производительностью P-State, которая создавалась для повышения энергоэффективности процессоров, без заметного ухудшения производительности. Поддержка P-State присутствует в Linux начиная с версии 3.9. Далее будет показано как перейти на использование P-State вместо обычного управления частотой процессора через ACPI в Ubuntu 14.04 LTS.

Всё описанное ниже автор этих строк настраивал на ноутбуке Dell Insprion 3542 с процессором Pentium 3558U, работающем под управлением Ubuntu 14.04 i386. Однако большая часть рекомендаций с минимальными изменениями (или вообще без таковых) справедлива и для других систем с процессорами Sandy Bridge и новее и ядром Linux 3.9 и новее.

В Ubuntu ядро Linux собрано с поддержкой P-State, но её надо активировать передачей ядру при загрузке параметра "intel_pstate=enable". Это можно сделать модифицировав переменную "GRUB_CMDLINE_LINUX" в файле /etc/default/grub:

GRUB_CMDLINE_LINUX="intel_pstate=enable"

После этого необходимо обновить конфигурацию загрузчика командой:

update-grub

Далее остаётся перезагрузить машину и продолжить ей пользоваться, однако для большей эффективности имеет смысл произвести более тонкую настройку. В первую очередь полезно указать что нам нужно больше: "powersave" или "performance" (по умолчанию "performance"). Сделать это удобнее всего используя пакет "cpufrequtils". Установим его:

apt-get install cpufrequtils

Далее в файле /etc/default/cpufrequtils укажем требуемую дисциплину:

GOVERNOR="powersave"

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

invoke-rc.d cpufrequtils restart

Для ещё более тонкой настройки можно использовать файлы в виртуальной директории /sys/devices/system/cpu/intel_pstate:

  • max_perf_pct: максимальная производительность в процентах от максимальной частоты (без учёта режима turbo). Значения больше 100 интерпретируются как 100.
  • min_perf_pct: минимальная производительность в процентах от максимальной частоты (без учёта режима turbo). Значение меньше чем $min_freq*100/$max_freq интерпретируются как $min_freq*100/$max_freq. Для процессора 3558U с диапазоном частот от 800MHz до 1700MHz минимальное значение составляет 800*100/1700 = 47.
  • no_turbo: если в этот файл записать единицу то будет отключен режим turbo, ноль соответственно включает. Для процессоров без режима turbo этот параметр просто игнорируется.

Разумно менять эти настройки с помощью laptop-mode-tools в зависимости от режима работы (от сети/от батареи). В laptop-mode-tools версии 1.65 и выше уже есть поддержка Intel P-State, однако в Ubuntu 14.04 пакет laptop-mode-tools имеет версию 1.64. Но это не является большим препятствием, так как необходимый модуль можно написать самостоятельно. Для этого создадим файл /etc/laptop-mode/modules/intel_pstate:

#! /bin/sh
#
# Модуль для управления Intel P-State из laptop-mode-tools 1.65, адаптированный для 1.64

# Директория внутри sysfs, используемая для настройки
INTEL_PSTATE_SYSFS=/sys/devices/system/cpu/intel_pstate

# Установка параметров sysfs
# Первый параметр: имя параметра
# Второй параметр: значение параметра
set_intel_pstate_param () {
        if [ -f "$INTEL_PSTATE_SYSFS/$1" ]; then
                log "VERBOSE" "Executing: echo $2 > $INTEL_PSTATE_SYSFS/$1"
                if ! echo "$2" > "$INTEL_PSTATE_SYSFS/$1" ; then
                        echo "SETTING OF KERNEL PARAMETER FAILED: echo $2 \> $INTEL_PSTATE_SYSFS/$1"
                fi
        fi
}

# Если модуль включен
if [ x$CONTROL_INTEL_PSTATE = x1 ] || [ x$ENABLE_AUTO_MODULES = x1 -a x$CONTROL_INTEL_PSTATE = xauto ]; then
        # Если работаем от сети
        if [ $ON_AC -eq 1 ] ; then
                # Если laptop mode активен
                if [ "$ACTIVATE" -eq 1 ] ; then
                        INTEL_PSTATE_PERF_MIN_PCT="$LM_AC_INTEL_PSTATE_PERF_MIN_PCT"
                        INTEL_PSTATE_PERF_MAX_PCT="$LM_AC_INTEL_PSTATE_PERF_MAX_PCT"
                        INTEL_PSTATE_NO_TURBO="$LM_AC_INTEL_PSTATE_NO_TURBO"
                # Если laptop mode не активен
                else
                        INTEL_PSTATE_PERF_MIN_PCT="$NOLM_AC_INTEL_PSTATE_PERF_MIN_PCT"
                        INTEL_PSTATE_PERF_MAX_PCT="$NOLM_AC_INTEL_PSTATE_PERF_MAX_PCT"
                        INTEL_PSTATE_NO_TURBO="$NOLM_AC_INTEL_PSTATE_NO_TURBO"
                fi
        # Если работаем от батареи
        else
                INTEL_PSTATE_PERF_MIN_PCT="$BATT_INTEL_PSTATE_PERF_MIN_PCT"
                INTEL_PSTATE_PERF_MAX_PCT="$BATT_INTEL_PSTATE_PERF_MAX_PCT"
                INTEL_PSTATE_NO_TURBO="$BATT_INTEL_PSTATE_NO_TURBO"
        fi
        # Устанавливаем параметр
        set_intel_pstate_param max_perf_pct "$INTEL_PSTATE_PERF_MAX_PCT"
        set_intel_pstate_param min_perf_pct "$INTEL_PSTATE_PERF_MIN_PCT"
        set_intel_pstate_param no_turbo "$INTEL_PSTATE_NO_TURBO"
fi

Делаем модуль исполняемым:

chmod +x /etc/laptop-mode/modules/intel_pstate

Опишем конфигурацию нашего нового модуля в файле /etc/laptop-mode/conf.d/intel_pstate.conf:

# Отладку отключаем
DEBUG=0

# Включаем модуль
CONTROL_INTEL_PSTATE="auto"

# При работы от сети и без laptop mode
NOLM_AC_INTEL_PSTATE_PERF_MIN_PCT=47
NOLM_AC_INTEL_PSTATE_PERF_MAX_PCT=100
NOLM_AC_INTEL_PSTATE_NO_TURBO=0

# При работы от сети и с laptop mode
LM_AC_INTEL_PSTATE_PERF_MIN_PCT=47
LM_AC_INTEL_PSTATE_PERF_MAX_PCT=100
LM_AC_INTEL_PSTATE_NO_TURBO=0

# При работе от батареи
BATT_INTEL_PSTATE_PERF_MIN_PCT=47
BATT_INTEL_PSTATE_PERF_MAX_PCT=55
BATT_INTEL_PSTATE_NO_TURBO=1

Отключаем модуль cpufreq, для этого в файле /etc/laptop-mode/conf.d/cpufreq.conf нужно поправить переменную "CONTROL_CPU_FREQUENCY":

CONTROL_CPU_FREQUENCY=0

На этом настройка Intel P-State закончена. У автора этих строк замена acpi-cpufreq на intel_pstate позволила продлить время автономной работы примерно на полчаса: с 4.5-5 часов до 5-5.5 часов.

На этом всё. Приятной работы!

Ключевые слова: pstate, intel pstate, powersave, ubuntu.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2015-09-20 21:26:30 (#)

Здравствуйте! Поясните по подробнее про min_perf_pct. У меня например это значение 22 (макс. частота 3,5 ГГц). Я хочу сделать так что процессор не повышал свою частоту при некоторой нагрузке, к примеру 50%. Сейчас загрузка ~ 10-20 % и частота почти максимальна. Правильно ли я понимаю что min_perf_pct нужно выставить более 50? Спасибо!

MooSE 2015-09-22 00:53:42 (#)

То что ты хочешь нельзя сделать средствами pstate. Ну по крайней мере я не знаю способа. Разве что в принципе ограничить верхнюю границу через max_perf_pct.

Anonymous 2015-09-22 18:28:59 (#)

Тогда какой смысл в min_perf_pct? Какие есть способы?

MooSE 2015-09-29 16:35:10 (#)

Смысл min_perf_pct в том чтобы ограничить минимальную производительность, ниже которой процессор не будет опускаться. Имеет смысл поднимать min_perf_pct если при минимальном значении в некоторых случаях производительность оказывается недостаточной.

По конкретно твоей проблеме я уже написал выше что не знаю способа.
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности