Я в настоящее время сервер 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
.
источник
Здесь происходит то, что у вас есть 25 потоков, способных принимать соединения, и вы отправляете 26 одновременных запросов. Этот последний запрос находится в очереди сокетов, в зависимости от размера вашего невыполненного задания.
Вторая проблема заключается в том, что все, что вы запускаете, занимает 2-3 секунды и занимает достаточно много времени, чтобы ответить, что 25 одновременных подключений замедляют его. Sleep (1) может работать, но что-то, где вы делаете блокировку файлов или таблиц из mysql, каждый параллельный запрос может ждать до завершения до тех пор, пока они не достигнут 45-секундного тайм-аута.
23мб звучит мало для процесса apache с mod_php и любыми загруженными модулями, поэтому я подозреваю, что вы можете увидеть, что эти процессы apache занимают немного больше памяти в процессе работы вашего приложения. Вы не можете действительно делать математику с MaxClients и памятью, как это ... это будет несколько близко, но, вы никогда не знаете.
Есть одна машина, 56M и 49M процессов.
другая машина:
другая машина:
Таким образом, использование памяти очень зависит от задачи, какие модули загружены и т. Д. В последних двух я считаю, что мы отключили pdo & pdo_mysql, так как это приложение не использует их.
Реальный вопрос в том, что вы делаете, что занимает 3 секунды? В современном мире это вечность и считается «блокирующим» приложением. Apache обычно не умирает, но оставляет эти потоки в очереди невыполненных работ до тех пор, пока не сможет обслуживать их или время ожидания запросов истекает Я полагаю, что ваше приложение, вероятно, вызывает тайм-аут Apache. Попробуйте это на странице, содержащей только phpinfo (); и посмотреть, если результаты одинаковы.
источник