У меня есть LAMP-сервер, который иногда может обслуживать ~ 400 запросов в секунду, конфигурация сервера:
CPU: Intel Quad Core Xeon X3430 (4 x 2.40 GHz, 8MB Cache)
RAM: 16 GB REG ECC DDR3
HD: 500 GB Enterprise Grade SATA II
OS: CentOS 64 Bit (Latest Stable)
Конфигурация предварительной вилки Apache2:
StartServers 128
MinSpareServers 16
MaxSpareServers 64
ServerLimit 1500
MaxClients 1500
MaxRequestsPerChild 10000
В пиковое время загрузка сервера очень высока, загрузка ЦП около 90%, а средняя нагрузка около 130
Я не уверен, что это ограничение на аппаратное обеспечение сервера или что-то не так в моей конфигурации prefork - в чем может быть проблема?
Вы разрешаете Apache создавать до 1500 детей для обслуживания запросов (ServerLimit
/ MaxClients
) - Неудивительно, что нагрузка на ваш сервер (количество процессов, ожидающих в очереди выполнения) становится огромной!
Мои первые предложения при 400 запросах в секунду с числами, которые вы указываете в своем вопросе, были бы «Переместите сервер MySQL в его собственный ящик» или, возможно, лучший выбор: «Добавьте еще один веб-сервер и сбалансируйте нагрузку ваших запросов».
Чтобы помочь вам выяснить, как определить размер дополнительного сервера, следуйте совету, который HDDP500 дал в своем ответе, чтобы определить средний размер процесса Apache. Выясните, сколько процессов apache вы хотите запустить на новом сервере, и определите, сколько оперативной памяти вам понадобится для их обработки. Не забудьте добавить запас прочности (пару гигов).
Выяснить требования к процессору (скорость / количество ядер) немного сложнее - вам нужно будет принять во внимание, сколько «работы» сервер должен сделать для создания каждой страницы. Инструмент вроде XDebug может помочь вам здесь, сообщив вам, сколько времени требуется для создания страницы (вы должны выполнить этот тест на выгруженном сервере, а также на сервере под нагрузкой, но вы также должны не в большинстве случаев используйте такой инструмент, как XDebug, на рабочем сервере.)
Каков средний размер ваших процессов httpd?
Выполните эту команду, когда сервер находится под нагрузкой:
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'
Это покажет вам примерно средний размер процесса Apache.
Ваш MaxClients, вероятно, слишком высок.
Взгляните на прерывания вашего процессора и посмотрите, где начинается узкое место (через top
); как упоминалось ранее, было бы неплохо ServerLimit
/MaxClients
.
В зависимости от вашего потребления это может (должно) ускорить работу, поскольку вы уменьшите способность коробки истощать процессор.