Node.js рекомендував “max-old-space-size”


95

У мене виникають проблеми з розумінням того, як Node.js діє на основі параметра max-old-space-size.

Наприклад, у моєму випадку я використовую два t2.smallекземпляри AWS (2 Гб оперативної пам'яті).

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

Як визначити правильне значення на max-old-space-sizeоснові ресурсів сервера?

У моїй програмі постійно зростає використання пам'яті, і я намагаюся зрозуміти все про внутрішні вузли.


8
Я додаю коментар зараз, коли бачу, що це набагато зменшує кількість поглядів. Мені знадобився цілий тиждень, щоб зрозуміти, що в моїй програмі NodeJS не було витоку пам’яті, але збирач сміття ніколи не запускався. Зверніть увагу на це в системах з низькою пам’яттю, таких як t2.micro або t2.small екземпляри. Сервер зазнає аварії через недоступну оперативну пам'ять.
Borjante

Чи був спосіб змусити збирача сміття запустити?
ZG101,

@ Borjante, чому не працював збирач сміття?
божественний

2
Налаштований розмір max-old-space-size мав вищий ліміт, ніж загальний обсяг оперативної пам'яті, який мав апарат.
Borjante

Відповіді:


129

"Старий простір" - це найбільша та найбільш налаштовувана секція керованої (також зібраної сміття) кучі V8 (тобто там, де живуть об'єкти JavaScript), а --max-old-space-sizeпрапор контролює її максимальний розмір. Коли споживання пам'яті наближається до межі, V8 витрачатиме більше часу на збір сміття, намагаючись звільнити невикористану пам’ять.

Якщо споживання пам’яті купи (тобто об’єкти в реальному часі, які GC не може звільнити) перевищує обмеження, V8 виведе з ладу ваш процес (за відсутності альтернативи), тому ви не хочете встановлювати його занадто низьким. Звичайно, якщо ви встановите його занадто високим, тоді додаткове використання купи, яке дозволить V8, може призвести до того, що у вашій загальній системі закінчиться пам’ять (і замінити, або вбити випадкові процеси, через відсутність альтернативи).

Підводячи підсумок, на машині з 2 ГБ пам'яті я б, ймовірно, встановив --max-old-space-sizeприблизно 1,5 ГБ, щоб залишити трохи пам'яті для інших цілей та уникнути обміну.


4
Це саме те, що я сподівався отримати для відповіді, описуючи крайній випадок, коли або у системи, або у Node закінчується пам’ять.
Borjante

2
@jmrk: Здається, ви абсолютно праві, але коли я використовую 2 ГБ оперативної пам'яті та 4 ГБ обміну і встановлюю "--max-old-space-size" на 4 Гб, тоді процес вузла споживає всю пам'ять оперативної пам'яті і затримується на 1,9 ГБ. Питання тут "Чому обмін потрібно уникати використовувати ??" (Версія вузла 8.11.1)
Manish Trivedi,

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


і це повинно бути більше виділеної оперативної пам'яті
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/ 01/16 /… ) і що 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 -> 2096 Мб, v10.20.1 -> 1432 Мб
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 на node_module / @ angular cd node_module / @ angular

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


14
Чому потрібно переходити до каталогу @angular, щоб встановити значення середовища?
mgamsjager
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.