Увеличенный объем памяти после преобразования в Ruby Enterprise 1.8.7 - PullRequest
4 голосов
/ 08 марта 2011

При обновлении с Ruby 1.8.6 до Ruby Enterprise 1.8.7 p334 объем памяти почти удвоился. Это происходило на каждом из пяти обновленных нами серверов Fedora 8. Мы запускаем Rails 1.2.6 с Passenger 3.0.4.

Мунин получает объем памяти для каждого процесса, суммируя столбцы vsz и rsz из $ ps axo pid,comm,pmem,vsz,rsz. (Размер виртуальной памяти и размер резидентной памяти увеличиваются в одинаковом объеме)

Я понимаю, что эти столбцы обычно завышают объем памяти, фактически используемый процессами, но если это было использовано для измерения 1,8,6, а затем 1,8,7 РЗЭ, они должны быть одинаково раздутыми и, следовательно, все еще сопоставимыми.

Кроме того, выделенная память для машины (как указано в / proc / memstat) теперь регулярно перезапускается, что является новым. Объем выделенной памяти значительно увеличился, и похоже, что мы сейчас в пространстве подкачки.

Мы еще не настроили сборку мусора, но я не понимаю, как это повлияет на общий объем памяти.

Я включил переменную GC.copy_on_write_friendly в соответствии с рекомендациями Phusion FAQ.

Чем объясняется это увеличение использования памяти на 100% и как я могу это исправить? Любые идеи о том, как исправить или даже лучше контролировать / отлаживать, приветствуются.

Спасибо.

--- UPDATE

Чтобы проверить производительность, я уменьшил количество запущенных экземпляров (PassengerMaxPoolSize) с 12 до 10 на одном сервере. С другой стороны, я поднял PassengerPoolIdleTime до 15 минут. У меня есть третий, который используется в качестве контроля.

Я подумываю разместить на сервере не корпоративную версию 1.8.7p334, чтобы посмотреть, является ли она 1.8.7 или Enterprise Edition.

Кто-нибудь еще имеет опыт работы с этим типом проблемы?

Рассматривая отдельные процессы Rails, они составляют около 120 МБ на процесс в 1.8.6 и 175 МБ / процесс в REE 1.8.7, как указано в статистике пассажира.

--- ОБНОВЛЕНИЕ 2

Я поставил MRI 1.8.7 на сервер для сравнения с REE 1.8.7. Результаты были хуже, в том числе более высокий размер резидентной памяти и статистика по пассажирам. Конечно, обмен начался.

Это наводит меня на мысль, что у 1.8.7 просто больше, чем у 1.8.6.

--- ОБНОВЛЕНИЕ 3

Я поставил MRI 1.8.7 на сервер, было намного хуже, чем MRI 1.8.6 с точки зрения использования памяти, поэтому я немедленно вернулся к MRI 1.86.

Я запустил средний размер Rails-процесса, как указано в статистике пассажира-памяти. Процессы REE 1.8.7 были на 73 МБ больше, что кажется довольно большим.

Это означает, что мне нужно иметь значительно меньше запущенных процессов, чтобы соответствовать одному и тому же объему памяти.

Посмотрим, как они работают с меньшим количеством процессов. Я также начинаю настройку ГХ.

--- ОБНОВЛЕНИЕ 4

Кажется, Ruby 1.8.7 не поддерживает Rails 1.2.6. Первая официально поддерживаемая версия 1.8.7 - Rails 2.1. После обновления мы узнаем, в чем причина проблемы.

1 Ответ

3 голосов
/ 14 мая 2011

Вы перешли с 32-разрядной версии Ruby на 64-разрядную версию Ruby. Это удваивает размер указателей, которых во время выполнения много.

...