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