Управление режимами работы процессора ARM Allwinner A64 с помощью подсистемы CPUfreq

Cpufreq experiment temperatures

Одна из самых отличительных характеристик процессоров на архитектуре ARM от x86, является высокая энергоэффективность. Это достигается путем изменение тактовый частоты работы ядер в зависимости от вычислительной нагрузки системы. Если система находится в режиме ожидания, то частота ядер может снижаться до минимальных значений, а то и вовсе, ОС переведет ядро в режим сна. Чем ниже тактовая частота, тем медленнее работает устройство и тем меньше энергии оно потребляет (и наоборот). Подаваемое напряжение на ядра(ядро) ARM будет регулироваться в зависимости от тактовой частоты, эти режимы работы записаны в ядро ОС или находятся в дереве устройств Linux.

Для энергоэффективной работы недостаточно простого набора соотношений частоты/напряжения процессора с ограничениями минимальных и максимальных частот, требуется еще и стратегия переключения частот — регулятор. За переключением частот и настройкой регуляторов отвечает подсистема Linux — CPUfreq. Если ваше ядро поддерживает  масштабирование изменения частоты процессора, то вы можете получить список доступных регуляторов CPUfreq и пределы изменения частот.

Рассмотрим работу подсистемы CPUfreq на примере процессора ARM Allwinner A64, отладочная плата Banana Pi BPI-M64. SoC ARM Allwinner A64 — состоит из 4-х ядер Cortex-A53 (архитектура ARM64), максимальная частота работы 1200 МГц (источник).

Подсистема CPUfreq

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

Взглянем сначала на  /sys/devices/system/cpu/ . Здесь располагаются каталоги для каждого из логических процессоров: cpu0, cpu1, cpu2, cpu3.

Содержимое каталога  /sys/devices/system/cpu/ :

root@bananapim64:~# cd /sys/devices/system/cpu
root@bananapim64:/sys/devices/system/cpu# ls
cpu0 cpu2 cpufreq hotplug kernel_max offline possible present uevent
cpu1 cpu3 cpuidle isolated modalias online power smt vulnerabilities

Тактовая частота

Содержимое каталога  /sys/devices/system/cpu/cpufreq :

cpufreq Linux

Эти файлы есть у каждого из регуляторов. Обратите внимание на то, что настройки в каталоге  cpufreq  будут разными для каждого процессора, поэтому, чтобы получить общую политику для всех процессоров, нужно изменять настройку каждого процессора. Настройка  affected_cpus  показывает, на какие процессоры влияет изменение частоты. Дело в том, что некоторые процессоры зависят от частоты других процессоров в силу аппаратного или программного взаимодействия (или и того и другого) и должны поэтому изменять частоту одновременно. Под процессором подразумевается не целиком чип Allwinner A64, а процессоры-ядра, которые имеют порядковые номера: cpu0,cpu1,cpu2,cpu3. В архитектуре построения ядер ARM big.LITTLE группа нескольких слабых ядер (для фоновых задач) имеют более низкие пределы частот в отличие от группы мощных ядер (запуск и выполнение приложений). Политика работы ядер группы big будет отлична от политики группы LITTLE.

Узнаем, на какие процессоры влияет изменение тактовой частоты:

root@bananapim64:~# cd /sys/devices/system/cpu
root@bananapim64:/sys/devices/system/cpu# grep . cpu*/cpufreq/affected_cpus
cpu0/cpufreq/affected_cpus:0 1 2 3
cpu1/cpufreq/affected_cpus:0 1 2 3
cpu2/cpufreq/affected_cpus:0 1 2 3
cpu3/cpufreq/affected_cpus:0 1 2 3

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

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

Получим значения текущей частоты:

root@bananapim64:~# cd /sys/devices/system/cpu/cpufreq/policy0
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat cpuinfo_cur_freq
1008000
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat scaling_cur_freq
1008000

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

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

Узнаём максимальную, минимальную и все доступные частоты:

root@bananapim64:~# cd /sys/devices/system/cpu/cpufreq/policy0
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat cpuinfo_max_freq
1152000
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat cpuinfo_min_freq
648000
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat scaling_available_frequencies
648000 816000 912000 960000 1008000 1056000 1104000 1152000

Для ядер процессора Allwinner A64 доступны следующие частоты:

  • 648 МГц
  • 816 МГц
  • 912 МГц
  • 960 МГц
  • 1008 МГц
  • 1056 МГц
  • 1104 МГц
  • 1152 МГц

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

root@bananapim64:~# cd /sys/devices/system/cpu/
root@bananapim64:/sys/devices/system/cpu# cat cpu0/cpufreq/scaling_available_frequencies
648000 816000 912000 960000 1008000 1056000 1104000 1152000
root@bananapim64:/sys/devices/system/cpu# cat cpu0/cpufreq/scaling_max_freq
1010000
root@bananapim64:/sys/devices/system/cpu# cat cpu0/cpufreq/scaling_min_freq
648000
root@bananapim64:/sys/devices/system/cpu# echo 816000 > cpu0/cpufreq/scaling_min_freq
root@bananapim64:/sys/devices/system/cpu# cat cpu0/cpufreq/scaling_min_freq
816000

Регуляторы (стратегии переключения частот)

В файле  /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors  перечислены все доступные регуляторы. Проверяем доступные регуляторы:

root@bananapim64:~# cd /sys/devices/system/cpu/cpufreq/policy0
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat scaling_available_governors
conservative userspace powersave ondemand performance schedutil

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

Узнаём текущий драйвер:

root@bananapim64:~# cd /sys/devices/system/cpu/cpufreq/policy0
root@bananapim64:/sys/devices/system/cpu/cpufreq/policy0# cat scaling_driver
cpufreq-dt

Остальные файлы в этом каталоге доступны на запись для root и дают пользователю возможность изменять некоторые настройки CPUfreq. При использование регуляторов powersave и performance, пользователь может менять только файлы:  scaling_max_freq ,  scaling_min_freq  и  scaling_driver .

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

Проверяем активность регулятора и изменим текущий регулятор на «ondemand»:

root@bananapim64:~# cd /sys/devices/system/cpu/cpu0/cpufreq/
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# cat scaling_governor
performance
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# echo ondemand > scaling_governor
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# cat scaling_governor
ondemand

Типы регуляторов

Для процессора Allwinner A64 доступны следующие типы регуляторов:

  • performance
  • powersave
  • ondemand
  • conservative
  • userspace
  • schedutil

Регулятор «performance» (высокая производительность)

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

Регулятор «powersave» (энергосберегающий режим)

Противоположен регулятору «performance», устанавливает тактовую частоту процессора на минимальное значение соответственно. Пользователь может изменить только предел минимальной частоты. Применяется если устройство питается от аккумуляторной батареи и не требуется высокая производительность, или когда необходимо минимизировать теплоотдачу от устройства (случай перегрева). Часто применяется на телефонах при снижение заряда батареи менее чем 15%.

Регулятор «ondemand» (по запросу)

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

root@bananapim64:/sys/devices/system/cpu/cpu0# cd /root
root@bananapim64:~# cd /sys/devices/system/cpu/cpu0/cpufreq/
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# echo ondemand > scaling_governor
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# cat scaling_governor
ondemand
root@bananapim64:/sys/devices/system/cpu/cpu0/cpufreq# cd /sys/devices/system/cpu/cpufreq/
root@bananapim64:/sys/devices/system/cpu/cpufreq# ls
ondemand policy0
root@bananapim64:/sys/devices/system/cpu/cpufreq# cd ondemand
root@bananapim64:/sys/devices/system/cpu/cpufreq/ondemand# ls
ignore_nice_load io_is_busy powersave_bias sampling_down_factor sampling_rate up_threshold
root@bananapim64:/sys/devices/system/cpu/cpufreq/ondemand#

Доступны следующие настройки:

  • ignore_nice_load
  • io_is_busy
  • powersave_bias
  • sampling_rate
  • sampling_down_factor
  • up_threshold

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

io_is_busy — записывается значение 0 или 1 (по умолчанию 0). Параметр io_is_busy влияет на общий расчет загрузки процессора. Если установлено значение 1, то активность ввода-вывода (I/O) включается в вычисления активности процессора, а если установлено значение 0, то она исключается. В операции ввода-вывода (I/O) входит обмен данных с носителями: диски HDD, SSD, microSD. Ситуация с влиянием на скорость обмена данными с microSD на плате Raspberry Pi описана в Overclocking : setting core_freq lower the SD card speed — Issue GitHub.

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

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

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

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

[TODO: добавить описание регуляторов conservative, userspace, schedutil]

Настройка режимов работы процессора при старте системы

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

Конфигурационный файл cpufrequtils

В файле  /etc/default/cpufrequtils  можно задать минимальную и максимальной частоту, включая регулятор.

root@bananapim64:~# cat /etc/default/cpufrequtils
ENABLE=true
MIN_SPEED=480000
MAX_SPEED=1010000
GOVERNOR=performance

после изменения настроек можно перезагрузить службу cpufrequtils:

root@bananapim64:~# systemctl restart cpufrequtils

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

[TODO: нуждается в проверке] Можно ли задать настройку io_is_busy в случае использование регулятора ondemand, неизвестно. В любом случае можно создать исполняемый файл bash для системы cron. Создадим скрипт cpufrequtils.sh и добавим его в cron задачу исполняемую при старте системы.

[TODO: дописать скрипт]

Утилита cpufreq-utils

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

root@bananapim64:~# apt-get update
root@bananapim64:~# apt-get install cpufrequtils

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

root@bananapim64:~# 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: cpufreq-dt
CPUs which run at the same hardware frequency: 0 1 2 3
CPUs which need to have their frequency coordinated by software: 0 1 2 3
maximum transition latency: 244 us.
hardware limits: 648 MHz - 1.15 GHz
available frequency steps: 648 MHz, 816 MHz, 912 MHz, 960 MHz, 1.01 GHz, 1.06 GHz, 1.10 GHz, 1.15 GHz
...

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

Ссылки

Вам также может понравиться

About the Author: Anton

Programistik