-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
При записи топиков в брокер создается очень много зависших процессов apachу2 (Broken pipe) #27
Comments
Не смог решить проблему на apache2 2.4.38-3+deb10u4. |
А почему термостат так себя ведёт? Наверное это не совсем корректное поведение оборудования, если оно так часто данные публикует. |
Абсолютно с Вами согласен, некорректное. |
relay_status публикуется при каждом получении данных о температуре, т.е. можно конечно добавить какое-то ограничение по тому, что если relay_status не изменился, то не публиковать его или, по крайней мере, не так часто, но это дополнительная нагрузка на отслеживание того, когда в последний раз была публикация. Я так понимаю, что проблема из-за того, что данные температуры так часто приходят? |
Нет не часто приходят. Как это сделано например в проекте wifi-iot: А если просто поставить в cycle_mqtt задержку sleep()? |
Исходя из описания, где-то что-то нештатно происходит, потому что у меня самого и на тех объектах, которые я обслуживаю, термостат работает по именно так, как задумано -- при поступлении информации от датчика температуры в термостат, значение сравнивается с заданной на термостате и в relay_status попадает либо 1 либо 0. Ни о каких записях со скоростью цикла речи не идёт. Кстати, такое возможно если у вас в MQTT получается "зацикливание", т.е. запись значения в MQTT инициирует событие считывания в MQTT -- такое возможно если для записи и считыния используется один и тот же топик MQTT. |
Да. |
Сделал раздельные топики на чтение и запись. К сожалению ничего не изменилось.
|
У вас всё равно цикличная запись получается и устройство в MQTT-топик дублирует полученную команду установки, чего по идее не должно быть. Напишите полную конфигурацию, как должно быть -- какой топик у вас для чтения состояния, какой для установки значения и как оно сейчас привязано к объекту в модуле MQTT |
Спасибо за быстрый ответ
Подскажите, где задается в Термостате Топик для чтения состояния. |
На Nginx то же самое. |
Я понял, что простые устройства (а может быть модуль mqtt) в принципе не работают с раздельными топиками. |
Дело в вашем устройстве, а не в MJD -- термостаты с MQTT работают без каких-либо проблем у меня на нескольких объектах с записью/чтением в разных топиках. У вас устройство публикует в MQTT событие записи в топик управления, что приводит к зацикливанию. Попробуйте ещё следующее -- удалить топик управления полностью, открыть топик чтения состояния и прописать путь записи прямо там. Например, топик чтения вида /sonoff/ESPURNA-2BAAC8/relay/0 , то поле Путь (Write) может быть /sonoff/ESPURNA-2BAAC8/relay/0/set |
Я в Минске, могу с ноутбуком подъехать. |
Или могу дать удаленный доступ |
Ещё раз повторюсь -- majordomo ничего от себя не добавляет, ваше устройство пишет в MQTT событие, на каждое такое событие формируется запрос на его обработку, что происходит посредством веб-сервера. Если ваше устройство формирует множество событий в секунду, то они, соответственно, все пытаются быть обработаны друг за другом. Разберитесь из-за чего устройство присылает подряд такое количество сообщений в MQTT. |
Сергей, то что вы повторили я понял и так. |
Проблема не в mqtt а в Sensor_temphum. |
Датчик_температуры работает нормально, |
sensor_pass срабатывает как часть метода valueUpdated, т.е. правила обработки (и пересылки) значений применяются при обновлении (установки) значения сенсора. может быть сенсор данные как-то дополнительно обрабатывает и в себя же сохраняет? |
Не знаю. |
SD Термостат при включении публикует в mqtt топик 30-50 раз в секунду.
Создается много 30-250 зацикленных процессов apache2
strace -p xxx
sendto(15, "\0\22/ESP32-51/output181", 21, 0, NULL, 0) = -1 EPIPE (Обрыв канала)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=6182, si_uid=33} ---
Процессы apache2 забивают CPU, система не отвечает.
Из ошибок только это
"Maximum execution time of 180 seconds exceeded","file":"/opt/majordomo_0/html/3rdparty/phpmqtt/phpMQTT.php","line":436}
Если ставлю в конец цикла cycle_mqtt.php задержку на полсекунды, то apache2 не множится, но топики читаются плохо.
Комп быстрый i5, debian10
Предлагаю не публиковать повторно топик так часто. В коде есть заремленыый кусок DELETE FROM mqtt_queue.
The text was updated successfully, but these errors were encountered: