Увеличение потребления памяти Phusion Passenger с 1.9.3 (система) до 2.1.2 (RVM) в Ubuntu

У меня есть система Ubuntu с 512 МБ физической памяти и 512 МБ подкачки. При запуске моих четырех приложений Rails 3.2.12 на сервере Passenger 4.0.45 (модуль Apache) с использованием однопользовательского (мой пользователь) RVM Ruby 2.1.2, он использует примерно на 30% больше памяти, чем когда я настраиваю Passenger для использования более старой системы (root) Ruby 1.9.3. Это единственное отличие в конфигурации Пассажира.

Это заставляет Пассажира перемещать другие приложения для замены при обращении к одному, что означает, что каждый раз, когда к другому приложению обращаются, его нужно загружать из свопинга, что приводит к задержке. Это означает, что у меня почти не хватает памяти, если одновременно используются несколько приложений, и они медленно реагируют на пользователей.

Я не могу понять, почему при использовании RVM Пассажир использует больше памяти. Я сомневаюсь, что это из-за Ruby 2.1.2, если нет параметров памяти, которые мне нужно настроить.

1 ответ

Решение

Стандартные настройки для ruby ​​2.1.2 действительно увеличивают использование памяти по сравнению с 2.0.0 (что, я думаю, было на одном уровне с 1.9.3, если вы не учитываете улучшения при записи в 2.0.0)

Причина в том, что в Ruby 2.1 появился новый алгоритм сборки мусора. Короче говоря, алгоритм предполагает, что в то время как некоторые объекты живут долго (например, объекты, представляющие ваш код), другие очень недолговечны. Старые рубины тратят много времени, пытаясь понять, все ли объекты готовы для сбора мусора, тогда как ruby ​​2.1 переключается между второстепенными (только пытаются собрать недолговечные объекты) и основными (пытается собрать долгоживущие).

Это увеличивает производительность (второстепенные коллекции намного быстрее) за счет некоторого использования памяти.

Вы можете настроить это, используя (среди прочего) RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR переменная окружения. По умолчанию установлено значение 2, значение 0,9 отключает сборщик мусора поколений, а промежуточные числа заменяют память на производительность.

Вы также можете использовать библиотеку jemalloc (на любой версии ruby), чтобы немного повысить производительность и немного уменьшить использование памяти.

Наконец, часть проблемы с приложениями rails состоит в том, что многие приложения имеют то, что можно назвать средне-живыми объектами, которые выполняются для всего запроса - попытки Руби разделить объекты всего на 2 поколения недостаточно. Ruby 2.2 планируется улучшить.

У Сэма Шафрона есть отличный пост на эту тему, если вы хотите узнать больше

Кроме того, ruby ​​2.1.3 внес некоторые изменения в синхронизацию gc, что в большинстве случаев уменьшает использование памяти по сравнению с 2.1.2.

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