На даний момент у мене працює сервер Apache2 з VV OpenVZ mpm-prefork
і mod_php
на ньому 512М реальної / 1024М оперативної пам'яті (без підкачки). Провівши кілька тестів, я виявив, що максимальний розмір процесу, який отримує Apache, становить 23 М, тому я встановив MaxClients
25 (23М х 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
.