Node.js рекомендовал «максимальный-старый-размер-пространство»

95

Мне сложно понять, как Node.js действует в зависимости от параметра max-old-space-size.

В моем случае, например, я использую два t2.smallэкземпляра AWS (2 ГБ ОЗУ).

Не знаю почему, но я установил max-old-space-size=4096(4 ГБ). Что в этом случае делает узел? Может ли такая конфигурация привести к возможному сбою выделения памяти?

Как определить правильное значение в max-old-space-sizeзависимости от ресурсов сервера?

Мое приложение постоянно увеличивает использование памяти, и я пытаюсь понять все о внутреннем устройстве узла.

Borjante
источник
8
Я добавляю комментарий сейчас, когда вижу, что это становится более спокойным. Мне потребовалась целая неделя, чтобы понять, что в моем приложении NodeJS не было утечки памяти, но сборщик мусора никогда не запускался. Помните об этом в системах с нехваткой памяти, таких как экземпляры t2.micro или t2.small. Сервер выйдет из строя из-за нехватки оперативной памяти.
Borjante
Был ли способ заставить работать сборщик мусора?
ZG101 06
@Borjante, почему не работает сборщик мусора?
божественный
2
У настроенного максимального размера-старого-пространства был более высокий предел, чем общий объем ОЗУ, который имел компьютер.
Borjante

Ответы:

129

«Старое пространство» - это самый большой и наиболее настраиваемый раздел управляемой (также известной как «сборщик мусора») кучи V8 (то есть там, где находятся объекты JavaScript), и --max-old-space-sizeфлаг контролирует ее максимальный размер. Когда потребление памяти приближается к пределу, V8 будет тратить больше времени на сборку мусора, чтобы освободить неиспользуемую память.

Если потребление памяти кучи (т.е. живые объекты, которые GC не может освободить) превышает предел, V8 приведет к сбою вашего процесса (из-за отсутствия альтернативы), поэтому вы не хотите устанавливать его слишком низким. Конечно, если вы установите слишком высокое значение, то дополнительное использование кучи, которое позволит V8, может привести к тому, что ваша система в целом исчерпает память (и либо подкачка, либо уничтожение случайных процессов из-за отсутствия альтернативы).

Таким образом, на машине с 2 ГБ памяти я бы, вероятно, установил --max-old-space-sizeоколо 1,5 ГБ, чтобы оставить часть памяти для других целей и избежать подкачки.

jmrk
источник
4
Это именно то, что я надеялся получить в ответ, описывая крайний случай, когда системе или узлу не хватает памяти.
Borjante
2
@jmrk: Кажется, вы совершенно правы, но когда я использую 2 ГБ ОЗУ и 4 ГБ подкачки и устанавливаю для параметра «--max-old-space-size» значение 4 ГБ, тогда процесс узла потребляет всю оперативную память и застревает на 1,9 ГБ. Здесь возникает вопрос: «Почему следует избегать использования свопа?» (Версия узла 8.11.1)
Маниш Триведи
1
Флаг должен перекрывать все остальное. Пожалуйста, дважды проверьте наличие опечаток.
jmrk
2
От d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk
12

Обновление 2020

Эти параметры теперь официально задокументированы узлом . Для машины 2 ГБ вам, вероятно, следует использовать:

NODE_OPTIONS=--max-old-space-size=1536

Чтобы определить объем используемой памяти: Вы можете увидеть доступную память на машине Linux, используя free -m. Обратите внимание, что вы можете использовать freeи buffers/cacheпамять вместе, какbuffers/cache их можно выбросить (эти буферы и кеш - хороший способ использовать неиспользуемую память).

Обратите внимание на официальную документацию, гдеmax-old-space-size также упоминается:

На машине с 2 ГБ памяти рассмотрите возможность установки значения 1536 (1,5 ГБ).

Следовательно значение выше. Учтите, что объем памяти, необходимый для базовой ОС, не сильно меняется, поэтому вы с радостью можете сделать 3,5 на машине 4 ГБ и т. Д.

микемаккана
источник
1
Из ссылки, которой вы поделились из документов Node.js, говорится: «На машине с 2 ГБ памяти рассмотрите возможность установки 1536 (1,5 ГБ)»
Идан Даган,
1
Спасибо @IdanDagan, я добавлю это к ответу.
mikemaccana
11

Эта ошибка возникает, когда память, выделенная для выполняемого приложения, меньше требуемой памяти. По умолчанию ограничение памяти в Node.js составляет 512 МБ. Чтобы увеличить эту сумму, вам нужно установить аргумент ограничения памяти —-max-old-space-size. Это поможет избежать проблемы с ограничением памяти.

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c

S. V
источник
и она должна быть больше, чем выделенная оперативная память
HD ..
Я больше не уверен, что это правда. Конечно, в одной системе у меня есть доступ к запущенному узлу 10.20.1, я вижу (с node --v8-options), что по умолчанию сообщается 4096, и без настройки max-old-space-sizeнабора тестов, который я запускаю, без проблем выделяется до 1,5 ГБ. Ссылка на статью среднего уровня относится к 2016 году, так что, вероятно, с момента ее написания все изменилось.
JaySeeAre
1
Трудно найти этому подтверждение; Я не могу найти ничего явного в документации для V8 или Node. Другая система, которая у меня есть, сообщает, что значение по умолчанию для v10, 12 и 14 равно 0. FWIW Я нашел пару недавних блоггеров, указывающих максимальный объем памяти как 1,5 ГБ ( tejom.github.io/general/nodejs/v8/debugging/2017/ 16.01 /… ) и что v12 имеет динамический максимум в зависимости от системы ( idginsiderpro.com/article/3257673/… ).
JaySeeAre
3
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 и v14.3.0 -> 2096Mb, v10.20.1 -> 1432Mb
JaySeeAre
@JaySeeAre, спасибо за эту команду, чтобы показать heap_size_limit. Для обычной оболочки UNIX ее нужно указывать по-другому:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Сэм Уоткинс,
-6

Если вы просто хотите, чтобы он работал над проектом, над которым вы работаете, выполните два шага:

  1. В вашем проекте cd to node_module / @ angular cd node_module / @ angular

  2. Теперь запустите команду ниже export NODE_OPTIONS = - max-old-space-size = 8192

сатиш сурьяванши
источник
14
Зачем нужно переходить в каталог @angular, чтобы установить переменную среды?
mgamsjager