Проблема с красным узлом из-за нехватки памяти

#node.js #npm #raspberry-pi #node-red

#node.js #npm #raspberry-pi #узел-красный

Вопрос:

Я использовал эту документацию (документ Node-red для RPI) для установки node-red. Установка выполняется нормально. Но после запуска node-red-start или node-red-pi я вижу следующий журнал с ошибками. Я не эксперт в nodejs. В журнале указана версия npm и nodejs.

 Mar 22:48:23 - [info] 

Welcome to Node-RED
===================

4 Mar 22:48:23 - [info] Node-RED version: v0.19.6
4 Mar 22:48:23 - [info] Node.js  version: v10.15.2
4 Mar 22:48:23 - [info] Linux 4.9.35-v7  arm LE
4 Mar 22:48:25 - [info] Loading palette nodes
4 Mar 22:48:30 - [info] Worldmap version 1.5.29
4 Mar 22:48:31 - [info] Dashboard version 2.14.0 started at /ui
4 Mar 22:48:35 - [warn] ------------------------------------------------------
4 Mar 22:48:35 - [warn] [node-red-contrib-generic-ble/generic-ble] Error: Cannot find module 'bluetooth-hci-socket'
4 Mar 22:48:35 - [warn] ------------------------------------------------------
4 Mar 22:48:35 - [info] Settings file  : /home/pi/.node-red/settings.js
4 Mar 22:48:35 - [info] Context store  : 'default' [module=memory]
4 Mar 22:48:35 - [info] User directory : /home/pi/.node-red
4 Mar 22:48:35 - [warn] Projects disabled : editorTheme.projects.enabled=false
4 Mar 22:48:35 - [info] Flows file     : /home/pi/.node-red/flows_server.json
4 Mar 22:48:35 - [info] Server now running at https://127.0.0.1:1880/
4 Mar 22:48:35 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

4 Mar 22:48:35 - [info] Starting flows
4 Mar 22:48:37 - [info] [worldmap:1ac45205.ff98ee] started at /worldmap
4 Mar 22:48:37 - [info] [worldmap:ac8fa4a4.314918] started at /worldmap
4 Mar 22:48:38 - [info] [worldmap:20c6db58.a44e34] started at /worldmap
4 Mar 22:48:38 - [info] [worldmap:bf26442c.e7f3b8] started at /worldmap
4 Mar 22:48:38 - [info] [worldmap:ee74d5bc.e8f268] started at /worldmap
4 Mar 22:48:38 - [info] Started flows
4 Mar 22:48:38 - [info] [mqtt-broker:mqtt] Connected to broker: mqtt://localhost:1883

<--- Last few GCs --->

[24581:0x34f1a28]   138171 ms: Mark-sweep 702.7 (729.7) -> 702.7 (733.2) MB, 9657.7 / 0.1 ms  (average mu = 0.092, current mu = 0.004) allocation failure scavenge might not succeed
[24581:0x34f1a28]   148339 ms: Mark-sweep 706.3 (733.2) -> 706.3 (733.2) MB, 9979.6 / 0.1 ms  (average mu = 0.055, current mu = 0.019) allocation failure scavenge might not succeed


<--- JS stacktrace --->
Cannot get stack trace in GC.
FATAL ERROR: MarkCompactCollector: semi-space copy, fallback in old gen Allocation failed - JavaScript heap out of memory
  

Теперь у меня есть больше доступной информации, трассировка стека…

 ==== JS stack trace =========================================

    0: ExitFrame [pc: 0x37deae9c]
    1: StubFrame [pc: 0x37dec080]
Security context: 0x4b492701 <JSObject>
    2: encode(aka encode) [0x4fdd867d] [/home/pi/.node-red/node_modules/qs/lib/utils.js:~118] [pc=0x20067594](this=0x36c8438d <undefined>,str=0x43a423d1 <Very long string[17508]>)
    3: arguments adaptor frame: 2->1
    4: stringify(aka stringify) [0x4fdd737d] [/home/pi/.node-red/node_modules/qs/lib/stringify.js:61] [bytecode=0x289...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
  

Это означает, что в моих узлах есть узлы с ошибками? Если да, то как я могу определить, у какого узла ошибка?

Комментарии:

1. Пытались ли вы изменить конфигурацию памяти, как описано в разделе Запуск NodeRed в документе, на который вы ссылались? Что произошло?

2. @nekomatic Операционная система запущена на raspberry pi, и ошибка показывает, что объем кучи уже составил 700 Мб, поэтому не будет намного больше места для увеличения размера до достижения предела в 1 ГБ.

3. node-red-pi --max-old-space-size=256 имеет тот же эффект:-( 96358 ms: Mark-sweep 258.7 (270.7) -> 258.5 (272.7) MB

4. Эти настройки фактически сделали кучу НАМНОГО меньше, поэтому я подозреваю, что это просто приведет к более быстрому сбою системы.

Ответ №1:

Важной частью ошибки является:

  fallback in old gen Allocation failed - JavaScript heap out of memory
  

Это означает, что виртуальной машине NodeJS, на которой запущен Node-RED, не хватает памяти.

Без надлежащего понимания того, что делает ваш поток, невозможно сказать, почему это происходит, но справедливым предположением было бы то, что вы либо пытаетесь обрабатывать входящие сообщения (откуда-то) медленнее, чем они поступают, или, возможно, вы сохраняете данные в контексте и никогда не удаляете их, поэтому они накапливаются со временем.

Редактировать:

Трассировка стека для ООМ не обязательно помогает, это как раз то, что пытались выделить в тот момент, когда больше не было места. Это не означает, что это является причиной.

Как упоминалось ранее, единственный способ отладить это — иметь подробное представление о том, что делает ваш поток (и Stack Overflow, вероятно, не лучшее место для работы с этим. Вы можете добиться большего успеха на форуме Node-RED или slack, где вы можете найти кого-нибудь, кто сможет решить это с вами)

Комментарии:

1. существует способ отображения потребления пространства по идентификатору узла? У меня более 50 узлов:-(. спасибо

Ответ №2:

Проблема заключалась в неправильной конфигурации узла telegram. Это вызвало self в qs/lib/utils.js:~118 строка была больше, пока не заняла место в куче…

Спасибо