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

Сервер Apache порождает все больше и больше процессов, исчерпывает объем оперативной памяти и умирает

У нас есть установка LAMP, которая работала довольно хорошо в течение полугода, когда сервер Apache (серверов MySQL нет в этой коробке) только начал умирать. Кажется, со временем он начал порождать все больше и больше процессов. В конце концов он израсходует всю память, и сервер просто умрет. Мы используем префорк.

А пока мы просто продолжаем добавлять больше ОЗУ и увеличивать параметры MaxClients и ServerLimit до 512. Но мы просто продлеваем сбой. Число по-прежнему медленно растет. Может быть, через день он достигнет этого предела.

Что происходит? У нас всего около 15-20 запросов в секунду. У нас есть 1 ГБ памяти, и она не используется наполовину. Никакого обмена не происходит.

Почему Apache создает все больше и больше процессов? Это почти как где-то течь!

Ящики базы данных в порядке, они не вызывают задержки запросов. Мы протестировали несколько запросов, все быстро!

[Для тех, кто наткнулся на этот старый вопрос ...]

Быстрый ответ:

Проверьте свои KeepAlive настройки в вашем файле apache2.conf или httpd.conf. Установите свой KeepAliveTimeout от 2 до 5 секунд.

Подробности:

Я обнаружил, что по умолчанию Apache KeepAlive является on и KeepAliveTimeout установлен на 15 секунд. Это будет означать, что обращение к странице одного пользователя заставит сервер ждать, пока тот же пользователь запросит другую страницу / ресурс в течение 15 секунд, прежде чем он откажется и обработает чей-то запрос.

Эта настройка ОЧЕНЬ полезна, когда пользователь запрашивает исходный файл index.html, а затем через секунду или две позже запрашивает связанные файлы CSS, javascript и изображения. Однако современные компьютеры и сетевые / интернет-соединения означают, что браузер обычно запрашивает связанные ресурсы менее чем за 2 секунды. Apache будет обслуживать эти последующие страницы, а затем ждать еще 15 секунд на случай, если пользователю потребуется что-то еще. Это крайне неэффективно в условиях высокой посещаемости.

Если вы получаете 15 уникальных подключений в секунду, и каждое подключение остается активным в течение 15 секунд ... Я уверен, вы можете увидеть, как все будет довольно быстро сгруппировано. У вас будет 225 запущенных процессов Apache, из которых 90 +% полностью простаивают, ожидая запроса другой страницы при открытом соединении.

Я видел несколько предложений по настройке вашего KeepAliveTimeout где-то между 2 и 5 секундами. Я лично установил для некоторых серверов значение 2, а для других - 5. Я больше не получаю такого же замедления работы системы, когда у меня возникают пики трафика.

В твоем httpd.conf файла, у вас, вероятно, будет закомментированный раздел, который выглядит примерно так:

<IfModule mod_status.c>
        <Location "/server-status">
                SetHandler server-status
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
        </Location>
        ExtendedStatus On
</IfModule>

Глядя на один из моих серверов, на котором возникла проблема с слишком высокой нагрузкой, я вижу аналогичную проблему ... строки 'SS' должны никогда получить так высоко:

Srv   PID    Acc       M  CPU   SS       ...  Request

0-0   22830  1/9/3640  K  2.36  7        ...  GET /[].css HTTP/1.1
1-0   79114  0/0/858   W  0.00  121462   ...  POST /cgi/[] HTTP/1.1
2-0   22856  0/1/3211  W  0.00  20       ...  POST /cgi/[] HTTP/1.1
3-0   22890  0/0/2697  W  0.00  0        ...  GET /server-status HTTP/1.0
4-0   79105  0/5/525   W  0.34  121463   ...  POST /cgi/[] HTTP/1.1
5-0   22892  1/1/764   K  0.00  6        ...  GET /[].js HTTP/1.1
6-0   22893  1/1/449   K  0.00  5        ...  GET /[].js HTTP/1.1
7-0   22894  1/1/57    K  0.00  5        ...  GET /[].js HTTP/1.1
8-0   22895  1/1/426   K  0.00  4        ...  GET /[].js HTTP/1.1
9-0   -      0/0/40    .  0.00  2        ...  OPTIONS * HTTP/1.0
10-0  22897  0/0/16    _  0.00  4        ...  OPTIONS * HTTP/1.0
11-0  22898  0/0/8     _  0.00  4        ...  OPTIONS * HTTP/1.0

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

Обновить : конечно, это предполагает, что что-то не так. (на основе вашего комментария всего 10-15 запросов в секунду). У меня есть другие серверы, на которых люди зеркалируют файлы от нас, и, поскольку файлы довольно большие, и есть несколько человек, которые, как известно, открывают 500 потоков с не такой большой пропускной способностью, это съест все 1024 соединения, но это совершенно нормально и не вызывает сбоев.

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

Достаточно ли у вас пропускной способности интернета для отправки ответов? Входящие запросы пропорционально очень малы, поэтому, если вы максимально используете любую ветвь (LAN, WAN, что угодно), ваши серверы накапливаются, пытаясь записать в сеть.

Проверьте очередь отправки с помощью вашей системной команды netstat (1). например, "netstat -nat" и посмотрите столбец Q отправки. Если у вас много исходящих данных в очереди, это означает, что у вас есть узкое место где-то в сети (за пределами вашей физической сетевой карты).