#node.js #websocket #ram #raspberry-pi3 #modbus
#node.js #websocket #ОЗУ #raspberry-pi3 #модбус #modbus
Вопрос:
Я использую raspberry pi 3 для извлечения последовательных данных (USB) с устройства, затем я отправляю эти данные с помощью websockets клиенту. Все выполняется на NodeJS.
Для извлечения данных с устройства мы используем modbus-rtu, но у нас проблема с оперативной памятью. Скрипт перестает работать через 1-2 часа. Мы выяснили, что .readHoldingRegisters() со временем увеличивает использование нашей оперативной памяти.
Есть какие-нибудь советы по решению?
Комментарии:
1. Найдите в Google «утечки памяти узла» , это даст вам хороший список страниц, на которых объясняется, как устранять утечки памяти.
Ответ №1:
Первое, что нужно сделать с узлом в среде с ограниченным объемом оперативной памяти (для узла доступно менее 1,5 ГБ), это сообщить самому узлу, потому что, похоже, он не может знать сам.
Если вы не используете GC, предположим, что у него доступно не менее 1,4 Гб, а узел GC является ленивым, что означает, что он будет ждать этого предела, чтобы освободить много памяти. Итак, первое, что нужно сделать на Rasberry Pi 3 с 1 ГБ оперативной памяти, это ускорить сборку намного раньше, например, на 500 МБ оперативной памяти.
node script.js --max-old-space-size=500
Это заставит GC действовать быстрее (размер старого пространства — не единственное пространство памяти узла, но оно самое большое, поэтому GC должен работать с процессом узла 500/600 Мб)
GC — это синхронная операция (отсюда и ленивый шаблон), это может повлиять на производительность, поэтому вам, возможно, придется точно настроить лимит.
Если вы все еще сталкиваетесь с проблемами после этого, у вас действительно утечка (память, которую мусор не может восстановить).