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

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

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

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

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

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

3 ответа

[Для блага других, наткнувшихся на этот старый вопрос... ]

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

Проверьте свои 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. Если у вас много исходящих данных в очереди, это признак того, что у вас есть узкое место где-то в сети (помимо вашей физической сетевой карты).

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