Ресурсы5 мин чтения
Почему ваше Node-приложение умирает на 2 ГБ при тарифе в 4 ГБ
Лимит контейнера и лимит кучи V8 — два разных потолка. Процесс упирается в нижний первым.
Процесс Node на тарифе в 4 ГБ, который падает, пока график в панели показывает 2 ГБ свободных, — это не баг хостинга. У Node свой потолок кучи, заданный независимо от объёма памяти контейнера, и по умолчанию он заметно ниже тарифа.
Два потолка
Лимит контейнера — это то, что мы даём серверу. Лимит кучи V8 — это то, сколько Node позволяет занять собственным объектам JavaScript, прежде чем сдастся и бросит ошибку. Старые версии Node ставят кучу около 1,5-2 ГБ независимо от машины; новые читают контейнер, но не всегда правильно.
Как поднять
node --max-old-space-size=3072 server.jsСтавьте на несколько сотен мегабайт ниже тарифа, никогда вровень. Куча — это не весь процесс: буферы, нативные модули и сам рантайм живут вне её, и куча ровно в размер контейнера означает, что ядро убьёт процесс раньше, чем V8 успеет запустить сборку мусора.
Но сначала проверьте, нужно ли это
Приложение, которое растёт, пока не упрётся в любой потолок, течёт, и поднятие потолка покупает часы, а не чинит. Если память ровно растёт при постоянной нагрузке, менять надо число в коде, а не в команде запуска.