CPU frequency and voltage scaling code in the Linux(TM) kernel
L i n u x C P U F r e q
C P U F r e q G o v e r n o r s
- information for users and developers -
Dominik Brodowski <linux@brodo.de>
some additions and corrections by Nico Golde <nico@ngolde.de>
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Viresh Kumar <viresh.kumar@linaro.org>
Масштабирование тактовой частоты позволяет вам изменять тактовую частоту ЦП на лету. Это хороший способ сэкономить заряд батареи, потому что чем ниже тактовая частота, тем меньше энергии потребляет процессор.
Что такое регулятор CPUFreq?
Регуляторы в ядре Linux 2.1 Производительность 2.2 Powersave 2.3 Пользовательское пространство 2.4 Ondemand 2.5 Консервативный 2.6 Schedutil
Интерфейс регулятора в ядре CPUfreq
Ссылки
Что такое регулятор CPUFreq? ======== ======================
Большинство драйверов cpufreq (кроме intel_pstate и longrun) или даже большинство алгоритмов масштабирования частоты процессора допускают только Частота ЦП должна быть установлена на предопределенные фиксированные значения. Чтобы предложить динамическое масштабирование частоты , ядро cpufreq должно иметь возможность сообщать этим драйверам "целевую частоту". Таким образом, эти конкретные драйверы будут преобразованы в предложение вызова "-> target / target_index / fast_switch ()" вместо вызова "-> setpolicy ()". Для драйверов set_policy все остается прежним, хотя .
Как решить, какая частота в политике CPUfreq должна использоваться? Это делается с помощью "регуляторов cpufreq".
По сути, это следующий блок-схема:
ЦП можно настроить на независимое переключение | ЦП можно установить только в определенных "пределах" | на определенные частоты
"CPUfreq policy"
consists of frequency limits (policy->{min,max})
and CPUfreq governor to be used
/ \
/ \
/ the cpufreq governor decides
/ (dynamically or statically)
/ what target_freq to set within
/ the limits of policy->{min,max}
/ \
/ \
Using the ->setpolicy call, Using the ->target/target_index/fast_switch call,
the limits and the the frequency closest
"policy" is set. to target_freq is set.
It is assured that it
is within policy->{min,max}
"Производительность" регулятора CPUfreq статически устанавливает для ЦП наивысшую частоту в пределах scaling_min_freq и scaling_max_freq.
Регулятор CPUfreq "powersave" статически устанавливает ЦП на самую низкую частоту в пределах scaling_min_freq и scaling_max_freq.
Средство управления CPUfreq «пространство пользователя» позволяет пользователю или любой программе пользовательского пространства, работающей с UID «root», устанавливать для процессора определенную частоту , создавая sysfs файл "scaling_setspeed", доступный в каталоге CPU-device .
Регулятор CPUfreq ondemand устанавливает частоту процессора в зависимости от текущей загрузки системы. Оценка нагрузки запускается планировщиком через обработчик update_util_data-> func; при запуске cpufreq проверяет статистику использования ЦП за последний период, и регулятор соответственно устанавливает ЦП. ЦП должен иметь возможность очень быстро переключать частоту .
Файлы Sysfs:
sampling_rate:
Измеряется в США (10 ^ -6 секунд). Это частота, с которой ядро проверяет использование ЦП и принимает решения о том, что сделать с частотой . Обычно это значение составляет около "10000" или более. Значение по умолчанию - (cmp. With users-guide.txt): transition_latency
$ echo `$ (($ (cat cpuinfo_transition_latency) * 750/1000))> ondemand / sampling_rate
sampling_rate_min:
Частота дискретизации ограничена задержкой перехода HW: transition_latency * 100
Или по ограничениям ядра:
Отображается максимальное значение ограничений ядра и задержки HW, и используется в качестве минимальной выборки показатель.
up_threshold:
Определяет, какой должна быть средняя загрузка ЦП между выборками 'sampling_rate', чтобы ядро приняло решение о , следует ли ему увеличивать частоту. Например, когда для параметра установлено значение по умолчанию "95", это означает, что между интервалами проверки ЦП должен использоваться в среднем более 95%, чтобы затем {{1} } решаем, что необходимо увеличить частоту процессора.
ignore_nice_load:
Этот параметр принимает значение «0» или «1». Если задано значение «0» ( по умолчанию), все процессы учитываются по значению «Использование процессора» . Если установлено значение «1», процессы, которые выполняются со значением «nice» , не будут учитываться (и, следовательно, будут проигнорированы) при расчете общего использования .Это полезно, если вы выполняете вычисление на своем портативном компьютере с интенсивным использованием ЦП, и вас не волнует, сколько времени потребуется на выполнение, поскольку вы можете "улучшить" его и предотвратить его участие в процесс принятия решения об увеличении частоты процессора.
sampling_down_factor:
Этот параметр управляет скоростью, с которой ядро принимает решение о том, когда уменьшать частоту при работе на максимальной скорости. Если для установлено значение 1 (по умолчанию), решения о переоценке нагрузки принимаются с одним и тем же интервалом независимо от текущей тактовой частоты. Но когда установлено значение больше , чем 1 (например, 100), он действует как множитель для интервала планирования для переоценки нагрузки, когда ЦП работает на максимальной скорости из-за высокой нагрузки. .Это повышает производительность за счет сокращения накладных расходов на оценку нагрузки и помогает ЦП оставаться на максимальной скорости, когда он действительно загружен, вместо того, чтобы переключаться вперед и назад по скорости. Эта настраиваемая функция не влияет на поведение при более низких скоростях / более низких нагрузках на ЦП.
powersave_bias:
Этот параметр принимает значение от 0 до 1000. Он определяет процентное (умноженное на 10) значение целевой частоты, которая будет уменьшена от целевой. Например, если установлено значение 100–10%, когда регулятор ondemand будет нацеливать на 1000 МГц, вместо этого он будет нацеливаться на 1000 МГц - (10% от 1000 МГц) = 900 МГц. По умолчанию установлено значение 0 (отключено).
Когда загружается драйвер смещения энергосбережения AMD, чувствительный к частоте - drivers / cpufreq / amd_freq_sensitivity.c, этот параметр определяет порог чувствительности частоты рабочей нагрузки, при котором используется более низкая частота выбирается вместо первоначального целевого значения регулятора ondemand. Частотная чувствительность - это аппаратное значение (для процессоров AMD семейства 16h и выше) от 0 до 100%, которое сообщает программному обеспечению, как производительность рабочей нагрузки, выполняемой на ЦП, изменится при изменении частоты . Рабочая нагрузка с чувствительностью 0% (память / привязка к вводу-выводу) не будет работать лучше на более высокой частоте ядра, тогда как рабочая нагрузка с чувствительностью 100% (привязанная к ЦП) будет работать лучше выше частота. Когда драйвер загружен, по умолчанию установлено значение 400 - для ЦП, выполняющих рабочие нагрузки со значением чувствительности ниже 40%, выбирается более низкая частота. Выгрузка драйвера или запись 0 отключат эту функцию.
«Консервативный» регулятор CPUfreq, очень похожий на регулятор «ondemand» , устанавливает частоту процессора в зависимости от текущего использования. Он отличается по поведению тем, что плавно увеличивает и снижает скорость ЦП, а не перескакивает на максимальную скорость в тот момент, когда на ЦП возникает какая-либо нагрузка . Такое поведение больше подходит в среде с питанием от батареи . Регулятор настраивается так же, как "ondemand" регулятор через sysfs, с добавлением:
freq_step:
Здесь описывается, на какой процент шагов следует увеличить частоту процессора и плавно уменьшился на. По умолчанию частота процессора будет увеличиваться на 5% от максимальной частоты процессора. Вы можете изменить это значение на любое значение от 0 до 100, где «0» будет эффективно блокировать ваш процессор на скорости независимо от его нагрузки, а «100» теоретически приведет к {{1 }} он ведет себя идентично регулятору "ondemand".
down_threshold:
То же, что 'up_threshold', найденный для регулятора "ondemand", но для противоположного направления. Например, когда установлено значение по умолчанию «20», это означает, что если загрузка ЦП должна быть ниже 20% между выборками, чтобы снизить частоту.
sampling_down_factor:
Функциональность, аналогичная регулятору ondemand. Но в "консервативном", он контролирует скорость, с которой ядро принимает решение о том, когда уменьшить частоту при работе на любой скорости. Нагрузка для увеличения частоты все еще остается оценил каждую частоту дискретизации.
Регулятор "schedutil" нацелен на лучшую интеграцию с планировщиком ядра Linux .Оценка нагрузки достигается с помощью механизма отслеживания загрузки отдельных объектов (PELT) планировщика, который также предоставляет информацию о последней загрузке [1]. Этот регулятор в настоящее время выполняет загрузку DVFS только для задач, управляемых CFS. Задачи планировщика RT и DL всегда выполняются с максимальной частотой. В отличие от всех других регуляторов , код находится в каталоге kernel / sched /.
Файлы Sysfs:
rate_limit_us:
Содержит значение в микросекундах. Регулятор ожидает времени rate_limit_us перед повторной оценкой нагрузки после того, как он оценил нагрузку один раз.
Для более подробного сравнения с другими регуляторами обратитесь к [2].
Новый регулятор должен зарегистрироваться в ядре CPUfreq, используя "cpufreq_register_governor". Структура cpufreq_governor, которую необходимо передать этой функции , должна содержать следующие значения:
губернатор-> имя - уникальное имя для этого регулятора. губернатор-> владелец -. THIS_MODULE для модуля регулятора (при необходимости).
плюс набор перехватчиков для функций, реализующих логику регулятора.
Регулятор CPUfreq может вызвать драйвер процессора процессора, используя одну из этих двух функций:
int cpufreq_driver_target (struct cpufreq_policy * policy, unsigned int target_freq, unsigned отношение int);
int __cpufreq_driver_target (struct cpufreq_policy * policy, unsigned int target_freq, беззнаковое отношение int);
target_freq должен находиться в пределах policy-> min и policy-> max , конечно. В чем разница между этими двумя функциями? Когда ваш регулятор находится в прямом кодовом пути вызова обратных вызовов регулятора, например Governor-> start (), policy-> rwsem все еще сохраняется в ядре cpufreq, {{1 }} и нет необходимости снова блокировать его (фактически, это вызовет тупиковую ситуацию ). Поэтому используйте __cpufreq_driver_target только в этих случаях.Во всех других случаях (например, когда есть "демонизированная" функция, которая просыпается каждую секунду), используйте cpufreq_driver_target, чтобы принять policy-> rwsem перед передачей команды к драйверу cpufreq.
[1] Отслеживание загрузки отдельных объектов: https://lwn.net/Articles/531853/ [2] Улучшения в управлении частотой процессора: https://lwn.net/Articles/682391/
источник: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt