Одна из самых отличительных характеристик процессоров на архитектуре 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 будут разными для каждого процессора, поэтому, чтобы получить общую политику для всех процессоров, нужно изменять настройку каждого процессора. Настройка 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.
Ссылки
- Cpufreq — linux-sunxi.org
- How to alter CPU frequency? — Armbian
- CPU Performance Scaling — Kernel Linux
- About Allwinner A64 — linux-sunxi.org
- Что такое big.LITTLE — beardycast.com
- Часть 1. Подсистема CPUfreq — IBM
- Часть 2. Общая настройка и настройка регуляторов — IBM
- 4.4. CPU FREQUENCY GOVERNORS — RedHat
- Overclocking : setting core_freq lower the SD card speed #1368 — GitHub raspberrypi
- How to permanently set CPU power management to the powersave governor? — AskUbuntu
- CPU Performance Scaling — Kernel Linux