Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

суббота, 15 января 2011 г.

Установка и настройка cpufreq

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

Итак, потребуются: права root, пакет cpufrequtils, модули ядра acpi_cpufreq, freq_table (сам подгрузится по зависимости. просто нужно, чтобы он был в ядре), модули режимов: cpufreq_*, где * - нужный вариант из: performance, powersave, ondemand или conservative.

Чтобы не изобретать велосипеды, сразу пришла в голову мысль про cpufreq - модули в ядре есть, поэтому этот вариант самый простой, действенный и удобный. Для управления пользователем режимами cpufreq необходимо установить пакет cpufrequtils

В моём арче это выглядит так:
pacman -S cpufrequtils

Затем нам нужно определиться, что за режим управления частотой процессора нам нужно выбрать. Объясню кратко и очень грубо:
performance - максимальная производительность. устанавливается максимально доступная (номинальная) частота процессора.
powersave - максимальная экономия энергии. устанавливается минимальная доступная частота процессора.
ondemand - устанавливается частота по требованию, в зависимости от загрузки процессора.
conservative - очень похожий на ondemand метод, только несколько более плавно повышает частоту процессора, отдавая приоритет более низким частотам, если нагрузка позволяет.

необходимо осознавать, что, в любом случае, смена частоты не происходит мгновенно - на это всё равно требуется некоторое время, поэтому, если компьютер используется активно и очень часто меняется нагрузка на процессор, то, теоретически, производительность системы может несколько уменьшиться при использовании методов ondemand или conservative.

в моём случае всё очень просто - ondemand наиболее подходящий кандидат.

посмотреть информацию о доступных для процессора режимах можно так:
1. загружаем необходимый модуль: modprobe acpi_cpufreq
2. выполняем команду: cpufreq-info

в случае с моим старичком, вылезло:
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 10.0 us.
  hardware limits: 2.80 GHz - 3.20 GHz
  available frequency steps: 3.20 GHz, 2.80 GHz
  available cpufreq governors: ondemand, performance
  current policy: frequency should be within 2.80 GHz and 3.20 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 3.20 GHz.
analyzing CPU 1:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 10.0 us.
  hardware limits: 2.80 GHz - 3.20 GHz
  available frequency steps: 3.20 GHz, 2.80 GHz
  available cpufreq governors: ondemand, performance
  current policy: frequency should be within 2.80 GHz and 3.20 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 3.20 GHz.
Таким образом, мы получаем важную информацию, касательно доступных режимов, доступных частот, а так же текущих показателей.
Хочу обратить внимание, что перечень доступных режимов зависит от того, какие модули подгружены.
Режим performance обычно при компиляции ядра ставится по-умолчанию, но нам никто не мешает это изменить.

Итак, я хочу использовать режим ondemand. Что мне нужно для этого сделать?
Как можно понять из вывода cpufreq-info, мой процессор P4 Prescott поддерживает лишь две позиции частоты - 2.8 GHz и 3.2 GHz.
Поэтому настройки сводятся к минимуму.
Открываем /etc/conf.d/cpufreq и оставляем лишь одну раскомментированную строку:
governor="ondemand"
Поскольку доступных режимов всего 2, то этого вполне будет достаточно.
Если же нужно будет задать частоту минимальную и максимальную (например, процессор имеет порог в 1.6 GHz и пиковую частоту в 3.1 GHz, а Вам не нравятся эти значения), то можно, например, выставить частотный диапазон в 2.0 Ghz - 3.0 Ghz, чтобы и процессор сильно не филонил, но и максимально не разгонялся, тогда раскомментируем и модифицируем строки:
min_freq="2.0GHz"
max_freq="3.0GHz"
Важно: cpufreq не сможет выставить частоту, которая не поддерживается процессором. Например, если у меня доступны лишь 2.8 и 3.2, то 2.6, 3.0 и другие варианты невозможны.

Теперь сохраняем файл. Затем нужно подгрузить тот модуль, который мы выбрали: modprobe cpufreq_ondemand
Затем запускаем демона: /etc/rc.d/cpufreq start

Всё. Уже работает. До перезагрузки.

Так вот, для того, чтобы каждый раз не подгружать модули и запускать демона вручную, пропишем их в автозагрузку.
Итак, открываем /etc/rc.conf и вписываем в секцию модулей те, которые нам нужны. в моём случае, это будет выглядеть так:
MODULES=(acpi_cpufreq cpufreq_ondemand)
acpi_cpufreq также необходим, как и модуль выбранного режима - обращаю на это Ваше внимание. вписывать freq_table нет необходимости, при загрузке этих двух модулей - и он подтянется автоматически.

Осталось в "демоническую секцию" прописать автозапуск cpufreq. У меня в моей системе получилось так:
DAEMONS=(syslog-ng !network !netfs cpufreq @adsl crond hal kdm @rtirq @cups)
это место в очереди обусловлено тем, что он начинает работать сразу же, т.е. во время загрузки последующих демонов - уже будет масштабирование частоты при необходимости. поэтому ему второе место - сразу после лога (чтобы в логе глядеть можно было на следы жизнедеятельности всех последующих демонов).

Для удобства, чтобы всегда можно было посмотреть текущую частоту без лишних данных, можно вписать в пользовательский ~/.bashrc строчку:
alias freq='cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq'
После перезахода в систему, чтобы посмотреть текущую частоту, достаточно будет открыть консоль, написать freq и нажать enter - получим данные в герцах.

Вот и всё. Сохраняем, перезапускаем систему, всё будет работать.

Конечно, лично мне это вряд ли существенно оптимизировать тепловыделение и энергопотребление - масштабирование частоты небольшое, но на более новых процессорах (особенно, такие температурно-темпераментные, как AMD Phenom и более новые)- это даёт заметные результаты. Странно, что, например, в ubuntu 10.04 "из коробки" этого нет.

P.S. на нынешнем своём процессоре - i5 2500K даже при отсутствии cpufreq частота процессора масштабируется автоматически - фирменная опция Intel Speedstep во всей красе.

1 комментарий: