ERR_WORKER_OUT_OF_MEMORY в рабочих потоках nodejs

Я получаю сообщение об ошибке Error [ERR_WORKER_OUT_OF_MEMORY]: worker terminated due to reaching memory limit, когда пытаюсь запустить рабочие потоки nodejs в среде Windows с ограниченными ресурсами.

  1. Каков лимит памяти на поток по умолчанию?
  2. Можно ли увеличить?

Спасибо.


person Muthukumar    schedule 16.04.2020    source источник


Ответы (1)


См. параметр resourceLimits, который можно передать конструктору Worker.

Цитата из документа:

ограничения ресурсов <Object>

Необязательный набор ограничений ресурсов для нового экземпляра движка JS. Достижение этих пределов приведет к остановке экземпляра Worker. Эти ограничения влияют только на движок JS, а не на внешние данные, включая ArrayBuffers. Даже если эти ограничения установлены, процесс все равно может прерваться, если он столкнется с глобальной ситуацией нехватки памяти.

maxOldGenerationSizeMb Максимальный размер основной кучи в МБ.

maxYoungGenerationSizeMb Максимальный размер пространства кучи для недавно созданных объектов.

codeRangeSizeMb Размер предварительно выделенного диапазона памяти, используемого для сгенерированного кода.

Я не видел ничего написанного о том, как nodejs выбирает эти значения по умолчанию, когда вы их не заполняете. Но их указание дает вам некоторый контроль.

Я бы добавил, что nodejs не особенно эффективно использует память при попытке вписаться в цель с ограниченными ресурсами. Он хранит в памяти вещи, которые, вероятно, на самом деле не нужны, например, весь оригинальный исходный код, который он компилирует. Его природа GC дает ему более широкий диапазон использования памяти, чем распределение, контролируемое вручную. Это также особенно плохо при одновременном чтении больших наборов данных и их разборе на множество небольших строк, поскольку это может привести к высокому пиковому использованию памяти, даже если многие из них удаляются сборщиком мусора, когда все успокаивается.

В качестве другого примера вы можете прочитать/разобрать файл JSON размером 10 МБ, и он будет занимать в 10 раз больше памяти для хранения в виде данных Javascript. Это не предназначено для обвинения nodejs в целом (я большой поклонник), но нужно быть намного осторожнее с тем, как вы используете инструмент, если вы пытаетесь вписаться в меньшие объемы памяти. Рабочий поток — это куча дополнительных накладных расходов памяти (собственная куча, собственный скомпилированный код и т. д.), гораздо больше, чем в чем-то вроде C/C++.

person jfriend00    schedule 16.04.2020
comment
Спасибо. Установка ограничения ресурсов помогла решить проблему. - person Muthukumar; 16.04.2020