Увеличение использования памяти с Ruby 2.1 по сравнению с Ruby 2.0 или 1.9
Недавно я развернул обновление Ruby с 2.0 до 2.1.5 для своего веб-приложения Heroku, и теперь я постоянно сталкиваюсь с ошибками квот памяти, тогда как с 2.0 и 1.9 этого никогда не происходило. Для нормального Heroku Dyno существует ограничение в 512 МБ, и я запускаю 2 процесса с Unicorn, а также один поток с Sidekiq на двух Dyno.
После чтения увеличения загрузки памяти Phusion Passenger с 1.9.3 (система) до 2.1.2 (RVM) в Ubuntu я попытался установить переменную среды RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
до 0,9, чтобы отключить сборщик мусора поколений, и это несколько улучшило потребление памяти, но все равно оставило меня рядом с тем, что потребляли 2.0 или 1.9. Поскольку память сейчас является моей главной задачей, я хотел бы посмотреть, смогу ли я решить эту проблему с помощью ruby 2.1.x вместо возврата к 2.0.
Вот несколько графиков, демонстрирующих проблему:
Незадолго до 14:00 я перешел на Ruby 2.0.0-p598 до Ruby 2.1.5, и проблемы с памятью были решены и остались на пределе.
Затем позже я попытался обновить до Ruby 2.1.5, но установив переменную среды RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
до 0,9. Как видите, использование памяти немного лучше, чем в исходном графике 2.1.5, но все же нарушает квоту памяти.
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR code> до 0.9 Heroku"> RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR code> на 0.9 New Relic">
2 ответа
Таким образом, ответ явно обновиться до версии Ruby 2.2.
Я впечатлен тем, что использование памяти фактически снизилось после обновления до 2.2, тогда как обновление до 2.1 стало огромным увеличением потребления памяти. Смотрите график ниже.
В крайнем левом положении потребление памяти на уровне 2.0 составляет около 386 МБ при загрузке, тогда как с 2.2 теперь оно составляет около 365 МБ.
Это известная проблема с Ruby (версии 2.1.x) и его сборкой мусора. После прочтения нескольких форумов / сообщений в блоге, кажется, нет реального решения, кроме как выполнить одно из следующих действий:
- перейдите на ruby 2.0 и дождитесь выпуска ruby 2.2
- использовать Unicorn Worker Killer для перезапуска рабочих Unicorn, когда они достигают определенного объема памяти, предотвращая ошибки Heroku R14
- некоторые предлагают настроить ваши переменные GC (см. здесь и здесь)
Вот ссылка на соответствующую дискуссию по ruby-lang.
Некоторые люди также заметили, что одним из источников проблем может быть драгоценный камень NewRelic, поэтому вы можете обновить / удалить его и посмотреть, поможет ли это.
Кредиты на некоторые ссылки и информацию для парней с форума upcase.com