Node.js убит из-за нехватки памяти

#node.js #memory

#node.js #память

Вопрос:

Я работаю Node.js на сервере только с 512MB of RAM . Проблема в том, что когда я запускаю скрипт, он будет убит из-за нехватки памяти.

По умолчанию Node.js ограничение памяти равно 512MB . Поэтому я думаю, что использование --max-old-space-size бесполезно.

Следует содержимое /var/log/syslog :

 Oct  7 09:24:42 ubuntu-user kernel: [72604.230204] Out of memory: Kill process 6422 (node) score 774 or sacrifice child
Oct  7 09:24:42 ubuntu-user kernel: [72604.230351] Killed process 6422 (node) total-vm:1575132kB, anon-rss:396268kB, file-rss:0kB
  

Есть ли способ избавиться от нехватки памяти без обновления памяти? (например, использование постоянного хранилища в качестве дополнительной оперативной памяти)

Обновление: это скребок, который использует запрос модуля узла и приветствие. Когда он запускается, он открывает сотни или тысячи веб-страниц (но не параллельно)

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

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

2. Ваши варианты сокращения потребления памяти полностью зависят от того, что вы делаете в своем приложении, которое потребляет больше всего памяти. Поскольку вы не делитесь с нами ничем из этого, нам немного сложно понять, какие есть варианты. Вероятно, вам нужно начать с понимания того, что использует больше всего памяти.

Ответ №1:

Если вы предоставляете узлу доступ к каждому последнему мегабайту из доступных 512, и этого все равно недостаточно, тогда есть 2 пути вперед:

  1. Уменьшите требования к памяти вашей программы. Это может быть или не быть возможным. Если вам нужна помощь в этом, вы должны опубликовать еще один вопрос с подробным описанием вашей функциональности и использования памяти.

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

Существует 3-я возможность использования swap пространства (дисковое хранилище, которое действует как резервная копия памяти), но это сильно повлияет на производительность. Если вы все еще этого хотите, погуглите, как настроить это для вашей операционной системы, есть много статей на эту тему. Это конфигурация ОС, а не узла.

Ответ №2:

Старый вопрос, но, возможно, этот ответ поможет людям. Использование —max-old-space-size не бесполезно.

До Nodejs 12 версии имели размер кучи памяти, который зависел от ОС (32 или 64 бита). Итак, следуя документации, на 64-разрядных машинах это (только старое поколение) будет 1400 МБ, что далеко от ваших 512 МБ.

Начиная с Nodejs12, размер кучи заботится о системной оперативной памяти; однако куча Nodejs — это не единственное, что есть в памяти, особенно если ваш сервер не выделен для нее. Поэтому установите разрешение —max-old-space-size, чтобы иметь ограничение в отношении старой кучи памяти, и если ваше приложение приблизится, сборщик мусора будет запущен и попытается освободить память.

Я написал сообщение о том, как я наблюдал это: https://loadteststories.com/nodejs-kubernetes-an-oom-serial-killer-story /