Я в настоящее время сервер Apache2 работает с mpm-prefork
и mod_php
на OpenVZ VPS с 512M реальной / 1024M Burstable RAM (без замены). После запуска некоторых тестов я обнаружил, что максимальный размер процесса, который получает Apache, составляет 23 MaxClients
МБ, поэтому я установил значение 25 (23 М x 25 = 575 МБ, хорошо для меня). Я решил запустить несколько нагрузочных тестов на моем сервере, и результаты оставили меня озадаченным.
Я использую ab
на своем настольном компьютере запрос главной страницы из блога WordPress.
Когда я запускаю ab
с 24 одновременными подключениями, все выглядит нормально. Конечно, загрузка процессора увеличивается, объем свободной оперативной памяти уменьшается, и в результате время ответа на запрос составляет 2-3 секунды.
Но если я запускаю ab
с 25 одновременными подключениями (мой лимит сервера), Apache просто зависает через пару секунд. Он начинает обрабатывать запросы, затем перестает отвечать на запросы, процессор переходит в режим ожидания на 100% и ab
время ожидания истекает. Журнал Apache говорит, что достиг MaxClients
.
Когда это происходит, Apache остается заблокированным с 25 запущенными процессами (они все находятся в «W», если я проверяю состояние сервера), и только после TimeOut
установки процессы начинают умирать, и сервер начинает отвечать снова (в моем случае это установлено до 45).
Мой вопрос: это ожидаемое поведение? Почему Apache просто умирает, когда достигает MaxClients
? Если он работает с 24 соединениями, не должен ли он работать с 25, просто нужно больше времени, чтобы ответить на каждый запрос и поставить в очередь остальные?
Мне кажется странным, что любой работающий ребенок ab
может сам убить веб-сервер, просто установив параллельные соединения с серверами MaxClients
.