Экономия энергии в Linux: Часть 2. Общая настройка и настройка регуляторов

Что можно настроить и как эти настройки влияют на энергопотребление

Эта серия из трёх статей содержит вводную информацию по снижению энергопотребления в вашей системе. Во второй части предлагается пошаговая инструкция по общей настройке подсистемы CPUfreq в Linux® и даются подробные сведения о пяти регуляторах в составе ядра (in-kernel governors) — performance, powersave, userspace, ondemand и conservative — и их настройках.

Дженифер Хоппер, инженер по программному обеспечению, IBM

author photo - Jenifer HopperДженифер Хоппер (Jenifer Hopper) — программист IBM Linux Performance Group в Остине, штат Техас. В настоящее время она занимается проблемами высокопроизводительных вычислений и рабочих нагрузок для измерения энергопотребления, а также системным профилированием и анализаторами данных.



28.12.2010

Об этой серии статей

В этой серии статей рассказывается о том, как настроить сервер IBM System x® с установленной Linux для достижения наибольшей энергоэффективности. Вы узнаете о регуляторах в составе ядра (in-kernel governors) и применении их настроек; также показано влияние настроенных регуляторов на производительность и рабочую нагрузку в системах электронной торговли. Практические иллюстрации даются для сервера System x с установленным дистрибутивом Red Hat Enterprise Linux версии 5.2 (RHEL 5.2), но они будут верными для любого ядра версии 2.6.x и любого процессора, поддерживающего частотное масштабирование.

В первой части были кратко описаны компоненты и принципы, на основе которых делается настройка производительности системы, в том числе: подсистема Linux CPUfreq, режимы C-state и P-state и пять регуляторов в составе ядра.

Во второй части приводятся подробности общих настроек подсистемы CPUfreq в Linux, пяти регуляторов —performance, powersave, userspace, ondemand и conservative— и их настроек.

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

Общие настройки CPUfreq

Начать использовать подсистему CPUfreq в Linux несложно. Давайте подробнее рассмотрим её настройки и некоторые функции интерфейса. Начнём с некоторых общих настроек, а именно:

  • Интерфейс /sys
  • Файл настроек cpuspeed
  • Утилиты cpufreq-utils

Использование интерфейса /sys

Файловая система /sys, начиная с подкаталога /sys/devices/system/cpu/, предоставляет пользовательский интерфейс для CPUfreq. Некоторые из этих файлов доступны на запись (для root), другие — только для чтения.

Взглянем сначала на /sys/devices/system/cpu/. Здесь располагаются каталоги для каждого из логических процессоров, настраиваемый параметр sched_mc_power_savings и (в случае, если он есть в вашей системе) настраиваемый параметр sched_smt_power_savings, который мы обсудим позже.

Листинг 1. Просматриваем содержимое /sys/devices/system/cpu/
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings

Внутри каталога каждого процесса находится каталог cpufreq, содержащий интерфейс CPUfreq:

Листинг 2. Просматриваем каталог cpufreq
[root@systemx cpu]# cd cpu0/cpufreq/
[root@systemx cpufreq]# ls -l
total 0
-r--r--r-- 1 root root 4096 Oct 31 14:53 affected_cpus
-r-------- 1 root root 4096 Oct 31 14:53 cpuinfo_cur_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 cpuinfo_max_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 cpuinfo_min_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_available_frequencies
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_available_governors
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_cur_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_driver
-rw-r--r-- 1 root root 0 Nov 5 11:44 scaling_governor
-rw-r--r-- 1 root root 4096 Oct 31 14:53 scaling_max_freq
-rw-r--r-- 1 root root 4096 Oct 31 14:53 scaling_min_freq

Если в системе настроены регуляторы conservative или ondemand, здесь также будет каталог с названием, соответствующим настроенному регулятору. Позже мы обсудим, как поменять регулятор.

Эти файлы есть у каждого из регуляторов. Мы поговорим о том, что означает каждая из настроек и как изменить некоторые из них; затем обсудим некоторые из настроек регуляторов в рамках этого интерфейса. Обратите внимание на то, что настройки в каталоге cpufreq будут разными для каждого процессора, поэтому, чтобы получить общую политику для всех процессоров, нужно изменять настройку каждого процессора, как это будет описано в следующих разделах статьи.

Настройка affected_cpus показывает, на какие процессоры влияет изменение частоты. Дело в том, что некоторые процессоры зависят от частоты других процессоров в силу аппаратного или программного взаимодействия (или и того и другого) и должны поэтому изменять частоту одновременно. Например, можно встретить такую настройку:

Листинг 3. Узнаем, на какие процессоры влияет изменение тактовой частоты
[root@systemx ~]# cd /sys/devices/system/cpu
[root@systemx cpu]# grep . cpu*/cpufreq/affected_cpus
cpu0/cpufreq/affected_cpus:0 1
cpu1/cpufreq/affected_cpus:0 1
cpu2/cpufreq/affected_cpus:2 3
cpu3/cpufreq/affected_cpus:2 3

Далее, настройка cpuinfo_cur_freq показывает текущую рабочую частоту процессора. В файле scaling_cur_freq указаны текущие масштабируемые частоты, используемые регуляторами.

Листинг 4. Узнаём значения частоты
[root@systemx cpufreq]# cat cpuinfo_cur_freq
2997000
[root@systemx cpufreq]# cat scaling_cur_freq
2997000

Значения частот в этом файле указаны в кГц.

Далее идут файлы, в которых хранится информация о доступных частотах процессора. В файлах cpuinfo_max_freq и cpuinfo_min_freq записаны максимальная и минимальная частоты, доступные в этой системе; файл scaling_available_frequencies содержит значения всех доступных частот.

Листинг 5. Узнаём максимальную, минимальную и все доступные частоты
[root@systemx cpufreq]# cat cpuinfo_max_freq
2997000
[root@systemx cpufreq]# cat cpuinfo_min_freq
1998000
[root@systemx cpufreq]# cat scaling_available_frequencies
2997000 2664000 2331000 1998000

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

Листинг 6. Проверяем доступные регуляторы
[root@systemx cpufreq]# cat scaling_available_governors
ondemand powersave conservative userspace performance

Из файла scaling_driver можно узнать, какой из драйверов cpufreq используется в системе. Наиболее типичные драйверы —acpi, speedstep-smi, speedstep-centrino, powernor_k8, powernow_k7, longhaul и т.д. Чтобы сменить драйвер, необходимо сначала выгрузить текущий, затем загрузить другой. Также проверьте, заработает ли желаемый драйвер с вашим процессором, прежде чем пытаться его использовать.

Листинг 7. Узнаём текущий драйвер cpufreq
[root@systemx cpufreq]# cat scaling_driver
centrino

Остальные файлы в этом каталоге доступны на запись для root и дают пользователю возможность изменять некоторые настройки cpufreq. Эти файлы — единственное, что может изменять пользователь для управления работой регуляторов powersave и performance. У других регуляторов есть дополнительные настройки, которые мы обсудим в следующем разделе.

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

Листинг 8 Проверяем активность регулятора и изменяем текущий регулятор
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings
[root@systemx cpu]# cat cpu0/cpufreq/scaling_governor
performance
[root@systemx cpu]# echo conservative > cpu0/cpufreq/scaling_governor
[root@systemx cpu]# cat cpu0/cpufreq/scaling_governor
conservative

В файлах scaling_max_freq и scaling_min_freq указаны максимальная и минимальная частота, доступные регулятору. Пользователь может изменить диапазон доступных тактовых частот, внеся доступное значение в эти файлы при помощи команды echo. Заметьте, что это знание должно быть одним из значений, указанных в файле scaling_available_frequencies, поскольку только эти значения доступны системе. И опять не забудьте, что эту процедуру нужно проделать отдельно для каждого процессора. Например:

Листинг 9. Изменение тактовых частот, доступных регулятору
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# cat cpu0/cpufreq/scaling_available_frequencies
2997000 2664000 2331000 1998000
[root@systemx cpu]# cat cpu0/cpufreq/scaling_max_freq
2997000
[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq
1998000
[root@systemx cpu]# echo 2331000 > cpu0/cpufreq/scaling_min_freq
[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq
2331000

Использование файла настроек cpuspeed

Кроме прямого внесения значений с помощью команды echo, как было показано выше, пользователь может прибегнуть к настройкам в файле cpuspeed. Эти настройки применяются для изменения драйвера, регулятора, максимального и минимального значения скорости, порогов использования процессора и настройки ignore_nice_load. В RHEL 5.2 утилита cpuspeed присутствует по умолчанию, но в других дистрибутивах её может и не быть. В таком случае её можно скачать с сайта carlthompson.net; инструкции по установке находятся в файле README. Чтобы использовать версию cpuspeed из RHEL 5.2, просто отредактируйте файл /etc/sysconfig/cpuspeed, вписав нужные значение переменных, и введите команду

/etc/init.d/cpuspeed restart

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

Использование утилит cpufreq-utils

В состав RHEL 5.2, а также некоторых других дистрибутивов входит пакет cpufreq-utils, предоставляющий другой пользовательский интерфейс для подсистемы CPUfreq. В других дистрибутивах этот пакет тоже скорее всего должен присутствовать. После установки rpm-пакета cpufreq-utils в системе появятся две утилиты: cpufreq-info и cpufreq-set.

Утилита cpufreq-info выводит информацию о процессорах и настройках CPUfreq для них, таких как текущая частота, её пределы, используемый драйвер CPUfreq, текущая политика, текущий регулятор и список affected-cpus.

Утилита cpufreq-set даёт пользователю возможность изменять доступный диапазон тактовых частот для каждого процессора, активный регулятор и текущую рабочую частоту для регулятора userspace. Подробности смотрите в man-руководствах cpufreq-info и cpufreq-set.


Настройки регуляторов

Обсудим теперь доступные пользователю настройки регуляторов.

Регуляторы powersave и performance

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

Регулятор userspace

Теперь мы приступаем к обсуждению настроек для конкретных регуляторов. При задействованном регуляторе userspace в каталоге cpufreq будет присутствовать файл scaling_setspeed , доступный на запись для root. Этот регулятор даёт пользователю или программе в пользовательском пространстве возможность изменять тактовую частоту процессора. С помощью команды echo пользователь может внести нужное значение частоты в этот файл или же представить возможность установить эту частоту какому-нибудь демону в пользовательском пространстве. Как говорилось ранее, во время обсуждения файлов настроек, вносить настройку в файл scaling_setspeed необходимо для каждого из процессоров.

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

  • cpudyn (CPU dynamic frequency control): этот демон меняет частоту в соответствии с загрузкой процессора, а также, для ещё большей экономии энергии, может переводить диски в режим ожидания (standby) при отсутствии дисковой активности.
  • cpufreqd: это демон можно настроить на реагирование на уровень заряда батареи, тип питания (от сети или от батареи), температуру, запущенные программы, уровень использования процессора и на другие факторы.
  • cpuspeed: этот демон изменяет частоту в соответствии с требованиями процессора, изменением источника питания, температурой и другими данными.
  • powernowd: этот демон регулятора изменяет частоту процессора в соответствии с загрузкой процессора; у него четыре режима поведения, выбираемых пользователем.

Регулятор Ondemand

При задействованном регуляторе ondemand в каталоге cpufreq присутствует каталог ondemand. В этом каталоге имеется множество регулируемых настроек. Все файлы, доступные на запись для root, можно изменить, вписав новое значение с помощью команды echo, как показывалось ранее. Заметьте, что любые изменения в настройках регулятора ondemand будут применяться на общесистемном уровне, поэтому нет необходимости изменять настройки для каждого процессора.

Листинг 10. Проверяем изменяемые настройки для ondemand
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/ondemand/
[root@systemx ondemand]# ls -l
total 0
-rw-r--r-- 1 root root 4096 Nov 19 10:30 ignore_nice_load
-rw-r--r-- 1 root root 4096 Nov 19 10:30 powersave_bias
-rw-r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate
-r--r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate_max
-r--r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate_min
-rw-r--r-- 1 root root 4096 Nov 19 10:30 up_threshold

В файл ignore_nice_load вписывается значение 0 или 1 (по умолчанию 0). При установленном параметре "1" любой процесс с установленными значением "nice" не будет учитываться при расчёте общего использования процессора. При параметре "0" учитываются все процессы. Эта настройка может пригодиться, если у вас есть программа, требовательная к процессорным ресурсам, но продолжительность ее работы не имеет значения. Если применить настройку "nice" к процессу, он не будет влиять на изменения частоты.

Далее, настройки файла powersave_bias были введены для того, чтобы слегка изменять поведение регулятора ondemand в целях большей экономии энергии путём снижения определённой частоты на указанный процент в ситуациях, когда пользователю не очень важна производительность. Эта настройка может иметь значение от 1 до 1000, что дает от 0.1% до 100% снижения частоты.

sampling_rate, измеряемая в микросекундах, определяет, насколько часто регулятор будет проверять использование процессора для определения нужной частоты. Эта настройка принимает значение в промежутке от sampling_rate_min до sampling_rate_max.

Наконец, настройка up_threshold даёт пользователю возможность изменять пороговое значение максимального использования процессора, влекущее за собой изменение частоты процессора. Значение по умолчанию — 80. Это означает, что через определённые промежутки, указанные в настройке sampling_rate, ядро проверяет процент использования процессора, и при 80% регулятор повышает частоту до максимально возможной.

Регулятор conservative

При использовании регулятора conservative в каталоге cpufreq появляется подкаталог conservative. В этом подкаталоге имеется множество настроек. Все файлы, доступные на запись для root, можно изменять, вписывая в них новое значение с помощью команды echo, как было показано ранее. Заметьте, что любые изменения в настройках регулятора conservative будут применяться на общесистемном уровне, поэтому нет необходимости изменять настройки для каждого процессора.

Листинг 11. Настройки, доступные для регулятора conservative
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/conservative/
[root@systemx conservative]# ls -l
total 0
-rw-r--r-- 1 root root 4096 Nov 19 11:31 down_threshold
-rw-r--r-- 1 root root 4096 Nov 19 11:31 freq_step
-rw-r--r-- 1 root root 4096 Nov 19 11:31 ignore_nice_load
-rw-r--r-- 1 root root 4096 Nov 19 11:31 sampling_down_factor
-rw-r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate
-r--r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate_max
-r--r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate_min
-rw-r--r-- 1 root root 4096 Nov 19 11:31 up_threshold

Настройки ignore_nice_load, sampling_rate, sampling_rate_max, sampling_rate_min и up_threshold аналогичны настройкам, уже описанным для регулятора ondemand.

Регулятор conservative также даёт пользователю возможность настроить значение down_threshold. К примеру, по умолчанию это значение настроено на 20. Это означает, что через определённые промежутки, указанные в настройке sampling_rate, ядро проверяет процент использования процессора, и если это значение ниже 20%, регулятор будет снижать частоту.

Настройка freq_step изменяет размер шага (в ту или иную сторону), на который регулятор изменяет частоту процессора. По умолчанию это значение равно 5, то есть регулятор будет изменять частоту на 5 процентов от максимальной или минимальной каждый раз, когда он принимает решения об изменении частоты. В случае, если значение равно 100, регулятор будет действовать точно так же, как и регулятор ondemand.

Наконец, sampling_down_factor работает как множитель к значению sampling_rate для снижения частоты опроса процессора. Например, если значение sampling_rate равно 10000, а значение sampling_down_factor— 2, то ядро будет проверять процент использования процессора каждые 20000 микросекунд.

Изменяемые настройки планировщика

Рассмотрим теперь две изменяемые настройки планировщика: —

  • sched_mc_power_savings— для планирования процессов ядра
  • sched_smt_power_savings— для планирования процессов в гиперпотоках ядра

sched_mc_power_savings

sched_mc_power_savings— это изменяемая настройка планировщика, расположенная в каталоге /sys/devices/system/cpu/. Если вы хотите использовать эту настройку, то не забудьте выбрать y для опции CONFIG_SCHED_MC в конфигурационном файле ядра, как описано в разделе настройки первой части этой статьи.

Листинг 12. Узнаём расположение sched_mc_power_savings
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls -l
total 0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu7
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_mc_power_savings

Значение в файле sched_mc_power_savings может быть равно 0 или 1; значение по умолчанию — 0. При установленном параметре "1" планировщик попытается загрузить работой наименьшее возможное количество ядер, чтобы остальные оставались свободны. Другими словами, если каждый процессор немного загружен, sched_mc_power_savings старается сконцентрировать эту работу на минимально возможном количестве процессоров. Это в свою очередь даёт возможность чуть дольше "передохнуть" некоторым процессорам, что экономит энергию, особенно если процессор поддерживает какие-либо режимы глубокого сна, например, режимы C, которые потребляют в простое крайне малое количество энергии. Итоговая экономия может зависеть от многих факторов, включая то, какое количество процессоров доступно в системе и какой из регуляторов работает. При установленном значении "0" планировщик не действует.

sched_smt_power_savings

sched_smt_power_savings— это ещё одна изменяемая настройка, которая также находится в каталоге /sys/devices/system/cpu/; однако она доступна только в системах, поддерживающих технологию HyperThreading. Если вы хотите использовать эту изменяемую настройку, не забудьте в конфигурационном файле ядра выбрать y для опции CONFIG_SCHED_SMT, как обсуждалось в разделе настроек в первой части.

Листинг 13. Находим sched_smt_power_savings
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls -l
total 0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu7
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_mc_power_savings
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_smt_power_savings

По аналогии с настройкой sched_mc_power_savings, в файл sched_smt_power_savings можно вписать значение 0 или 1; значение по умолчанию — 0. При значении 1 планировщик старается распределить процессы так, чтобы загружено было по возможности только несколько гиперпотоков в ядре, чтобы другие оставались свободны и в свою очередь экономили энергию с помощью режимов ожидания C.

Далее

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

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=605281
ArticleTitle=Экономия энергии в Linux: Часть 2. Общая настройка и настройка регуляторов
publish-date=12282010