Ошибочный R14 Heroku (Квота памяти превысила), использующий node.js

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

На heroku это кажется, идут вне потолка памяти нашего экземпляра RAM 1G, и GC не умирает. Интересно, является ли это вызвано тем, что узел настроен с более высоким пределом памяти затем фактический Dyno.

Перефразируйте: предел памяти node.js на herkou связан с пределом памяти Dyno?

7
задан 16 August 2015 в 18:30
1 ответ

Вот ответ от heroku. Похоже, что вам нужно внести изменения в конфигурацию и не может использовать нестандартную конфигурацию.

Привет, Стэн,

Спасибо за ссылку на эти документы; Мне нужно обновить этот терминальный пример, как я недавно заглушил чат-выход WEB_CONCURRENCY. Мы добавили протоколирование, когда мы добавили функцию в основном так что люди не будут удивлены, что эти новые переменные вторгаются в их среде.

Чтобы увидеть значения для вашего приложения, вы можете запустить:

$ heroku запустить "эхо $WEB_MEMORY, $WEB_CONCURRENCY". Однако, позвольте мне пояснить - эти значения существуют только для того, чтобы определить, сколько параллельных процессов должно быть запущено приложением для кластеризованного узла, и даже тогда, только если вы решите использовать значение WEB_CONCURRENCY в своем коде. Они вовсе не влияют на бинарное распределение памяти узла или его коллекцию мусора по умолчанию, которые являются абсолютно стандартными, ванильными версиями, загруженными с nodejs.org/dist:

https://devcenter.heroku.com/articles/node-concurrency#tuning-the-concurrency-level. V8 использует жадный и ленивый подход к сбору мусора. Кроме того, V8 по умолчанию предполагает, что у вас есть около 1.5 ГБ для работы (больше, чем 1 ГБ лимит 2X динамической системы). У вас есть несколько вариантов, если вы заинтересованы в изменении поведения памяти узла по умолчанию:

  • Вручную запускать GC всякий раз, когда память превышает установленный лимит (https://simonmcmanus.wordpress.com/2013/01/03/forcing-garbage-collection-with-node-js-and-v8/)

  • Установить max_old_space_size ниже, чем по умолчанию (например, узел --max_old_space_size=960). Несколько метрик в исходнике v8 привязаны к max_old_space_size, так что это может сделать gc несколько более агрессивным. Недостатком является то, что если вы превысите значение даже на байт, ваша программа аварийно завершает работу.

  • Установите gc_global на true, чтобы принудительно использовать всегда-глобальную коллекцию (по умолчанию false - учтите, что глобальная коллекция медленнее, чем многофазная коллекция по умолчанию).

  • Установите nolazy_sweeping на true, что также делает gc чуть более агрессивным.

Имейте в виду, что если вы превышаете около 1 ГБ памяти в одном узловом процессе, то лучше всего разделить этот процесс на несколько рабочих:

https://github.com/joyent/node/wiki/FAQ#what-is-the-memory-limit-on-a-node-process. Спасибо, Хантер

6
ответ дан 2 December 2019 в 23:40

Теги

Похожие вопросы