Регулярный опрос нескольких датчиков с использованием NodeJS - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно получать значения около 200 датчиков каждые 15 секунд или около того.Чтобы получить значения, мне просто нужно сделать HTTP-вызов с базовой аутентификацией и проанализировать ответ.Суть в том, что эти датчики могут быть на медленном соединении, поэтому мне нужно подождать не менее 5 секунд для одного датчика (но обычно они реагируют намного быстрее, но всегда есть такие, которые работают медленно и по таймауту).Итак, прямо сейчас у меня есть следующие настройки для этого:

Существует процесс NodeJS, который подключен к моей БД и знает все о датчиках.Он регулярно проверяет, есть ли новые или есть те, которые были удалены.Он порождает дочерний процесс для каждого датчика, и, если дочерний процесс умирает, он перезапускает его.Также это убивает, если датчик будет удален.Дочерний процесс выполняет HTTP-вызов своего датчика с 5-секундным значением тайм-аута и, если он получает значение, сохраняет его в Redis.Также он находится в бесконечном цикле с setTimeout 15 секунд.И есть третий процесс, который копирует все значения из Redis в основную базу данных MySQL.Таким образом, это было рабочим решением в течение полугода, но после серьезного обновления системы (с Ubuntu 14.04 до 18.04 и, следовательно, каждого пакета также обновлено), похоже, происходит утечка памяти, и я не могу понять, где.После запуска суммарные процессы занимают около 1,5 ГБ памяти.Но через день или около того это увеличивается до 3 ГБ и так далее, и прежде чем исчерпать память, мне нужно убить все процессы узла и перезапустить все это.

Так что теперь я пытаюсь найти более эффективные методычтобы достичь того же результата (запросить около 2-300 URL-адресов каждые 15 секунд и сохранить результат в MySQL).В данный момент я думаю о том, чтобы отключить Redis, и дочерние процессы будут взаимодействовать со своим главным процессом, а главный процесс будет напрямую писать в MySQL.Таким образом, мне не нужно загружать библиотеку Redis в каждый дочерний процесс, и это может сэкономить мне время.Поэтому мне нужны идеи о том, как уменьшить использование памяти для этого приложения (я ограничен PHP и NodeJS, в основном из-за моих знаний, поэтому о написании нативного демона не может быть и речи)

Спасибо!

1 Ответ

0 голосов
/ 10 сентября 2018

Решение оказалось проще, чем я думал. Мне пришлось переписать дочерний процесс в собственный скрипт bash, и это привело к тому, что использование памяти сократилось почти до нуля.

...