Увеличение использования памяти с 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, и проблемы с памятью были решены и остались на пределе.

переход с 2.1.5 на 2.0.0 Herokuпереход с 2.1.5 на 2.0.0 New Relic

Затем позже я попытался обновить до Ruby 2.1.5, но установив переменную среды RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR до 0,9. Как видите, использование памяти немного лучше, чем в исходном графике 2.1.5, но все же нарушает квоту памяти.

переход с 2.0.0 на 2.1.5 с <code> RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR </ code> до 0.9 Heroku RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR до 0.9 Heroku">переход с 2.0.0 на 2.1.5 с <code> RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR </ code> на 0.9 New Relic RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR на 0.9 New Relic">

2 ответа

Таким образом, ответ явно обновиться до версии Ruby 2.2.

Я впечатлен тем, что использование памяти фактически снизилось после обновления до 2.2, тогда как обновление до 2.1 стало огромным увеличением потребления памяти. Смотрите график ниже.

Использование памяти с 2.2

В крайнем левом положении потребление памяти на уровне 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

Другие вопросы по тегам