Могу ли я ограничить использование памяти Apache + на сервере без пространства подкачки - PullRequest
2 голосов
/ 21 сентября 2009

Я запускаю приложение rails с apache + passenger на виртуальных серверах, для которых не настроено пространство подкачки.

Сайт получает приличный объем трафика при ежедневных запросах 200K +, а иногда всей системе не хватает памяти, что вызывает странное поведение во всей системе.

Вопрос в том, что есть ли способ настроить apache или пассажира, чтобы он не исчерпал память (например, изящно перезапустить экземпляры пассажира, когда они начнут использовать, скажем, более 300M памяти).

Серверы имеют 4 ГБ памяти, и в настоящее время я использую опцию PassengerMaxRequests для пассажира, но это, похоже, не самое надежное решение здесь.

В настоящее время я также не могу переключиться на nginx, так что я не могу сохранить какую-то комнату.

Любые умные идеи, которые я, вероятно, упускаю, приветствуются.

Редактировать: мое временное решение

Я не перезагружал экземпляры Rails, когда они превышают определенный объем использования памяти. Engine Yard написал отличное сообщение в блоге о проблеме раздувания памяти ActiveRecord . Это наш главный подозреваемый по этому вопросу. Поскольку у меня не было много времени для оптимизации приложения, я установил PassengerMaxRequests на 300 и добавил 2 ГБ дополнительной памяти на сервер. С тех пор все было хорошо. Сначала я волновался, что повторный запуск экземпляров Rails делает его медленным, но, похоже, это не оказывает влияния, о котором мне следует беспокоиться.

Ответы [ 4 ]

1 голос
/ 19 января 2012

Если вы имеете в виду «ограничение» как уничтожение этих процессов и если это единственное приложение на сервере, а это Linux, то у вас есть два варианта:

Установить максимальный объем памяти, который может иметь один процесс:

# ulimit -m
unlimited

Или используйте cgroups для аналогичного поведения:

http://en.wikipedia.org/wiki/Cgroups

0 голосов
/ 14 июня 2012

У меня проблема с тем, что пассажирские процессы выходят из-под контроля и потребляют слишком много памяти. Я написал следующий сценарий, который помогает держать вещи под контролем, пока я не найду реальное решение http://www.codeotaku.com/blog/2012-06/passenger-memory-check/index. Это может быть полезно.

Пассажирские веб-экземпляры не содержат важного состояния (вообще говоря), поэтому их уничтожение обычно не является процессом, и пассажир перезапускает их по мере необходимости.

0 голосов
/ 07 января 2010

У меня нет стандартного решения, но вы можете использовать две команды, которые поставляются вместе с Passenger, чтобы отслеживать использование памяти и количество процессов: passenger-status и sudo passenger-memory-stats, см. Руководство пользователя для пассажиров Nginx или Руководство пользователя для пассажиров Apache .

0 голосов
/ 21 сентября 2009

Я бы посоветовал не перезапускать экземпляры (если это возможно), которые превышают «предел памяти», потому что это может поставить вашу систему в бесконечные циклы, когда процесс многократно достигает этого предела и перезапускается.

Может быть, вы могли бы написать простого демона, который постоянно следит за процессами и убивает любого, занимающего определенный объем памяти. Обязательно запишите любую информацию о процессе, который сделал это, чтобы вы могли исправить проблему, когда бы она ни возникала.

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

...