У меня есть два мини компьютера 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
Малина не находится в режиме троттлинга, но все равно иногда работает на пониженной частоте.
13 апреля 2020