Назад | Перейти на главную страницу

Httpd-процессы со временем используют больше памяти

Я использую сервер VPS Centos 6 с памятью 3 ГБ. Если я его перезагружу, у меня будет запущено около 4 или 5 служб httpd, и все они используют около 2,5% памяти (86 м в столбце res из верхней команды).

У меня только один веб-сайт, который еще не работает, поэтому я единственный, кто к нему подключается.

Однако каждый день я вижу, что процент памяти httpd увеличивается на 0,3 или 0,4 в зависимости от. Это означает, что через 4 или 5 дней эти процессы httpd будут использовать около 4% памяти (130 м в столбце res из верхней команды). Я не вижу никаких ошибок в журналах, и все работает правильно, но если я оставил сервер без перезагрузка на 2 недели закончится память.

Например, способ воспроизвести это будет с помощью команды ab. Например, если я запускаю:

ab -c 2000 -t 60 http://xxx.xxx.xxx.xxx/

После запуска каждая из служб httpd будет использовать на 0,3 или 0,4 больше памяти, чем до запуска теста.

Опять же ошибок в логах не вижу.

Это нормально?


Я проводил больше тестов и исследований. Мои ценности:

KeepAlive Off

<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit        15
MaxClients        15
MaxRequestsPerChild  2000
</IfModule>

Кажется, что это нормально, и у меня всегда есть около 500 МБ свободной памяти (по крайней мере, когда сервер только что перезагружается). Проблема в том, что пять процессов httpd, которые всегда живы, продолжают увеличивать размер, поэтому, когда трафик попадает на сервер и больше дочерних процессы создаются, они получают размер родительского процесса httpd. Таким образом, если родительские процессы httpd имеют размер 120 МБ, все дочерние процессы будут 120 МБ. Таким образом, не имеет значения, насколько мал MaxRequestsPerChild, потому что будет создан новый дочерний процесс, который займет столько же памяти, сколько и предыдущая. Какой-нибудь совет?

Вы фактически не говорите, какое программное обеспечение веб-сервера вы используете. Если вы говорите об apache (и это похоже на многопроцессорную модель), вам следует взглянуть на то MaxRequestsPerChild директива.

Если, например, вы используете приложения php, ruby ​​или perl, которые (как и большинство) не особенно осторожны в отношении утечек памяти, вам, вероятно, следует снизить MaxRequestsPerChild примерно до 40 или около того. Однако то, что такое хорошее соотношение цены и качества, немного варьируется. Некоторые стеки приложений связаны с гораздо большими затратами, связанными с перезапуском процессов, чем другие, а некоторые имеют гораздо больше проблем с утечкой памяти, чем другие. Я установил MaxRequestsPerChild от 5 до 1000 в различных обстоятельствах, но обычно лучше начинать с низкого уровня и постепенно повышать его, пока это кажется безопасным.

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

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

Вы также не хотите иметь слишком много свопа. Если у вас много подкачки, ваш сервер будет более или менее полностью не отвечать, пока он медленно потребляет свою память подкачки. Либо вы вмешаетесь с перезагрузкой (вы вряд ли заставите оболочку работать), либо вы используете весь свой своп, и убийца OOM начнет убивать процессы. Если до этого дойдет, вы бы предпочли, чтобы OOM Killer вступил в игру раньше. Избыточный своп только увеличивает время простоя. Распространенная рекомендация иметь в два раза больше подкачки, чем RAM, совершенно не подходит для большинства веб-серверов.

Поднимите свои minspareservers и maxspareservers. Я бы поставил максимум 15 или около того. Какой смысл убивать их ниже этого? min должно быть не менее 5.

У вас может быть утечка памяти - если рабочие Продолжай расти каждый раз, когда вы запускаете свой ab тест, ты наверное есть утечка памяти. (Небольшое увеличение использования памяти сверх того, что у вас есть при первом запуске сервера, - это нормально. Непрерывный предсказуемый рост - нет).

Если ваша проблема связана с утечкой памяти, возможно, НЕ ошибка веб-сервера, а скорее ваш код (PHP или любой другой язык сценариев, который вы используете, или какая-то библиотека, на которую вы полагаетесь, она написана плохо).

Способ исправить утечку памяти - проанализировать ваш код (как это сделать, будет вопрос о переполнении стека), найдите утечку памяти и устраните ее (или попросите человека, ответственного за утечку кода, исправить ее).


Если код непрозрачный (или у вас просто нет времени) Ответ mc0e предоставляет жизнеспособное решение: Убедитесь, что вы используете соответствующий MPM (в Unix это означает prefork или worker) и установите MaxRequestsPerChild на достаточно низкое значение, чтобы ваши рабочие были переработаны, прежде чем у вас закончится оперативная память.
Эта директива влияет на производительность которые подробно описаны в документации

Наконец я выяснил, в чем проблема: у меня не было утечек кода или какой-либо неправильной конфигурации. Система вела себя так, как предполагалось. Однако проблема была связана с брандмауэром веб-приложений, который обновляется слишком часто и каждый раз кэширует правила снова и снова и использует много памяти httpd.

Спасибо всем