Увеличение использования памяти с 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 Herokumoving 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 Herokumoving 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