vm с 512mb ram, и он время от времени вылетает из-за нехватки памяти, поэтому я увеличил память до 2gb, но поведение осталось таким же, разве что увеличились промежутки между вылетами, скрипт просто забирает порционно данные из одного места и пушит их в другое. Код не использует никаких классов и переменных экземпляров, переменные в которые кладу данные - рождаются и умирают в одной и той же функции, так что утечки быть не должно, мне кажется что GC не успевает убирать лишнее, или еще что то. В общем вопрос, как это все можно продебажить, или что делают в таких кейсах ? Просто хочется стабильности. У меня на elixir +100500 таких скриптов, и нигде нет таких проблем.
у меня помоему было похоже, в сервер добавил вызов GC.collect раз в 30 секунд, все прошло
Вдруг кому интересно, исправил косяк, я затупил с рекурсией n+1. В общем было что то вроде этого: class Importer def start sources.each do |source| spawn { import_from(source: source) } end end private def import_from(source, progress = nil) progress ||= last_progress_for(source: source) # some code to import data from source sleep 1.minute if progress.finished import_from(source: source, progress: progress) end end и поправил на такое class Importer def start sources.each do |source| spawn do progress = last_progress_for(source: source) loop do progress = import_from(source: source, progress: progress) end end end end private def import_from(source, progress : Progress) : Progress progress ||= last_progress_for(source: source) # some code to import data from source sleep 1.minute if progress.finished progress end end
Обсуждают сегодня