Увеличение использования памяти с 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 на двух динамиках.
После чтения Увеличение потребления памяти 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.
Вот некоторые графики, демонстрирующие проблему:
Накануне до 2 вечера я понизился до Ruby 2.0.0-p598 до Ruby 2.1.5, и проблемы с памятью были решены и остались под лимитом.
![moving from 2.1.5 to 2.0.0 Heroku]()
![moving from 2.1.5 to 2.0.0 New Relic]()
Затем позже я попробовал обновление до Ruby 2.1.5, но установил переменную окружения RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR
равную 0,9. Как вы можете видеть, использование памяти немного лучше, чем исходный график 2.1.5, но все еще нарушает квоту памяти.
![moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 Heroku]()
![moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 New Relic]()
Ответы
Ответ 1
Таким образом, ответ явно обновляется до версии Ruby 2.2.
Я впечатлен тем, что использование памяти фактически снизилось после обновления до версии 2.2, тогда как обновление до 2.1 было огромным увеличением потребления памяти. См. График ниже.
![Memory usage with 2.2]()
В отдаленном левом объеме памяти на 2.0 сидит около 386 МБ при загрузке, тогда как с 2.2 теперь он находится примерно на 365 Мб.
Ответ 2
Это известная проблема с Ruby (версии 2.1.x) и ее сборкой мусора. После прочтения нескольких форумов/сообщений в блогах, похоже, не существует реального решения, но можно сделать одно из следующих:
- перейти на рубин 2.0 и дождаться выхода ruby 2.2
- используйте убийца-убийца единорога, чтобы перезапустить единорогов, как только они достигнут определенного объема памяти, предотвратив ошибки Heroku R14.
- некоторые предлагают настроить ваши переменные GC (см. здесь и здесь)
Здесь ссылка на соответствующее обсуждение на ruby-lang.
Некоторые люди также заметили, что одним из источников проблем может быть камень NewRelic, поэтому вы можете обновить/удалить его и посмотреть, помогает ли он.
Кредиты для некоторых ссылок и информации для ребята из форума upcase.com