Начиная с семейства 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 часов.
На этом всё. Приятной работы!
Anonymous 2015-09-20 21:26:30 (#)