Принудительный запуск global.gc хорошо это или плохо?
На текущий момент я работаю в комманде, которая занимается разработкой для одной достаточно большой платформы. Есть задача интегрировать клиентов этой платформы.
Пока интеграционная шина в разрабоке необходимо реализовать интеграцию нескольких клиентов готовыми методами.
Эта временная интеграция разработана, но возникли серьезные проблемы.
Объем данных большой и эти методы не идеальны для обработки больших данных.
Нужно найти решение не переписывая метод, потому что слишком много на них завязано.
При выполнении интеграции полностью забивается оперативная память, и CPU крутится на пределе, в последствии сервер падает.
Далее я разбиваю работу методов на последовательное выполнение, дабы не хранить большой массив данных в оперативной памяти и сильно не грузить mongodb.
Это проблему решило, но не сильно, тк оперативка все так же загружалась в последствии сервер дропался.
Я попробывал принудительно с запусоком ноды запустить сборщик мусора --expose-gc и после каждого обращения к mongo global.gc() вызывал его. Результат положительный, даже при маленьком кол-ве рам интеграция выполняется замечательно.
Но мне сейчас нужно сделать выводы, это решает проблему или же это костыль, или же это проблема в самих методах из за чего происходит утечка RAM. Может ли это привести к отчистки жизненно важных данных для работы сервера?
Прошу дать оценку и возможные решения этой проблемы.
Я не могу однозначно выяснить причину по которой все ложится. Тк сталкиваюсь с эти в первый раз. Но вижу "симптомы".
Условно 2 самых тяжелых метода.
Первый перебирает bulk ~ 5к товаров и обновляет его с помощью апстерс, так же он читает другие данные, при этом делает запрос в БД при каждой итерации.
Забивается на 2ГБ ОЗУ (комманда top) (Это предел ноды --max_old_space_size=2000 ) и через какое то время крашится мой линукс, почему я так и не понимаю.
Вот статистика этой коллекции.
2й метод он генерирует 150к документов и сохраяет это в бд. Генерирует по 3к элементов последовательно.
Если я оборачиваю каждый запрос в promise и вызываю их с помощью Promise.all то фиаско моминтальное и 2х минут не проработает метод.
Когда я вызываю метод последовательно без принудидельного вызова сборщика мусора, то памят забивается в арифмитической прогресси + 100мб RAM, доходит до 2ГБ и через какое то время фиаско.
Если после каждого вызова метода принудительно запускаю сборщик global.gc(), то RAM держится на одном допустимом уровне 500мб. И меня это в принцепи устраивает.
Характеристики моего ПК 12гб озу 4 ядра. При фиаско моя рам забивается на 100%, я не могу делать снимки RAM дебаггером, тк система сильно загружена в этих моментов, моментальная фиаско.