Попытка решить проблему троттлинга Raspberry Pi

У меня есть два мини компьютера Raspberry Pi. Они являются центром умного дома в квартире и на даче.

Эти два компьютера очень похожи друг на друга. Одинаковая плата (Raspberry Pi 3B+), одинаковый корпус, они все время включены. На них работает один и тот же софт (Home Assistant), но с разными настройками.

Совершенно случайно обнаружил что она и та же операция на этих двух компьютерах выполнялась сильно разное время. (Не очень важно что это за операция, но если интересно — это была наливка ansible плейбука)

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

Пошел разбираться.

Я когда-то слышал что в некоторых ситуациях Raspberry Pi может делать "throttling". Т.е. если компьютеру фигово, то он работает не на полную мощность, а понижает частоту процессора.

Одни из причин почему Raspberry Pi может понижать температуру процессора — это температура. Нашел в документации что для Raspberry Pi 3 B+ температура включения throttling — это 60°C.

У меня в Home Assistant пишется температура Raspberry Pi, поэтому можно посмотреть на графики. Вот данные за два дня.

Дача:

Квартира:

На даче Raspberry Pi находится в неотапливаемом помещении, и это помогает поддерживать низкую температуру (и видно как температура окружающей среды влияет на температуру компьютера — днем температура выше чем ночью). На графике Raspberry Pi дома видно что температура близка к 60°C и иногда даже чуть-чуть больше.

Сейчас у меня нет никакого охлаждения Raspberry Pi. Просто плата в корпусе. Я специально для своих Raspberry Pi купил пассивные радиаторы и кулеры, но не ставил их. Пожалуй, уже пора установить пассивные радиаторы.

Графики это хорошо, но хочется найти подтверждения что действительно включается throttling (где-нибудь в логах или еще как-нибудь). Пошел читать в интернете. Оказалось, что для Raspberry Pi есть специальная команда которая может ответить на этот вопрос. Нужно набрать в консоли:

vcgencmd get_throttled

Запускаю на даче:

pi@raspberrypi:~ $ vcgencmd get_throttled
throttled=0x0

Запускаю дома:

pi@raspberrypi:~ $ vcgencmd get_throttled
throttled=0x50005

Такс. Числа разные. Что это такое и как интерпретировать? Если в выводе команды написано "throttled=0x0" — это означает что все отлично. Троттлинг не включается. А вот если там находится другое число, то что-то работает не оптимально.

Как понять что было? Нужно число (в моем случае это 0x50005) перевести в двоичный формат. Это шестнадцатеричное число, в двоичном представлении это:

$ perl -E 'say sprintf "%b", 0x50005'
1010000000000000101

Каждый бит из этого числа что-то означает (данные из документации):

В том числе, которое я получил, 0x50005, возведены биты:

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

Сейчас у меня Raspberry Pi подключен через блок питания на котором написано "Выходные характеристики: "4.75-5.25В; 2100мА":

Я попробовал еще два блока. Результат точно такой же. Команда "vcgencmd get_throttled" говорит что работает троттлинг. После того как я попробовал эти блоки питания я прочитал что на них написано. У обоих заявленные характеристики одинаковые.

Блок питания для китайской розетки "5V 1000mA":

И Apple блок питания "5V 1A":

На этом закончился запас блоков питания который был у меня дома.

На даче Raspberry Pi воткнут в блок питания который шел в комплекте со старыми iPhone — пузатый такой. Вроде бы бывают два варианта таких блоков питания. 5.1V 2.1A и 5.2V 2.4A. Не уверен какой там установлен.

Официальный блок питания Raspberry Pi выдает 5.1В 2.5А.

И на этом история пока заканчивается. Пока у меня нет другого блока питания чтобы заменить тот с которым есть проблема.

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

pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=600000000

Это цифра означает 600 Мегагерц. Raspberry Pi работает в режиме троттлинга, и я совершенно не удивился этому результату.

Но когда я запускаю эту же команду на Raspberry Pi на даче мне иногда показывается:

pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=1400000000

1.4 гигагерца. Ожидаемо. Но! Иногда Raspberry Pi на даче так же показывает 600 мегагерц. Один запуск показывает одно, другой другое.

pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=600000000
pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=1400000000

Малина не находится в режиме троттлинга, но все равно иногда работает на пониженной частоте.

Иван Бессарабов
ivan@bessarabov.ru

13 апреля 2020