Как настроить NodeJS Garbage Collector, чтобы планировать меньшее количество раундов Scavenger? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть приложение реального времени в NodeJS, которое прослушивает несколько веб-сокетов и реагирует на его события, размещая HTTPS-запросы;это работает непрерывно. Я заметил, что время отклика, во много раз во время выполнения, было намного выше, чем просто ожидаемая задержка в сети, что заставило меня исследовать проблему. Оказывается, сборщик мусора работал несколько раз подряд, добавляя значительную задержку (5 с, до 30 с) во время выполнения.

Проблема, похоже, связана с частым планированием цикла сбора мусора восвободить ресурсы из-за сбоя выделения. Хотя на выполнение каждого раунда уходит менее 100 мс, выполнение тысяч раз подряд приводит ко многим секундам. Мое единственное предположение состоит в том, что в какой-то момент в моем приложении выделенная куча близка к своему пределу, и в каждом раунде GC фактически освобождается мало памяти, которая продолжает запуск GC в длинном цикле. Приложение, похоже, не теряет память, потому что выделение памяти никогда не происходит. Кажется, что это просто грань, которая вызывает безумие GC.

Может ли кто-то со знанием / опытом пролить несколько советов о том, как использовать опции GC, которые предоставляет V8, для преодоления такой ситуации? Я пробовал --max_old_space_size и --nouse-idle-notification (как предложено в нескольких статьях, посвященных этой проблеме), но я не полностью понимаю внутреннюю часть реализации узла GC и влияние доступных параметров. Я хотел бы иметь больше контроля над тем, когда должен проходить раунд Мусорщика, или хотя бы увеличить интервал между последовательными раундами, чтобы он стал более эффективным.

...