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