Apache Request Stuck
У нашей системы компаний проблема медлительности на прошлой неделе. После некоторой отладки я смог воспроизвести проблему, нажав и удерживая клавишу F5, чтобы страница обновлялась много раз.
Страница замирает и перестает отвечать. Я понимаю, что какой-то запрос застрял, глядя на статус сервера.
Я перешел к процессу, и он показывает следующее сообщение: "flock(16, LOCK_EX")
Вот httpd.conf для prework.c и keepalive:
<IfModule prefork.c>
StartServers 4
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
Похоже, что запрос был заблокирован и застрял там навсегда, может ли это быть причиной медленной работы системы? Это вызвано какой-то неправильной конфигурацией?
ДОБАВИТЬ НА:
Я также понимаю, что в MySQL процесс спит и ничего не делает, когда страница не отвечает. Это пройдет через 60 секунд, которые, я считаю, являются временным ограничением.
ОБНОВЛЕНИЕ http.conf:
<IfModule prefork.c>
StartServers 2
MinSpareServers 2
MaxSpareServers 10
ServerLimit 256
MaxClients 100
MaxRequestsPerChild 4000
</IfModule>
2 ответа
У вас есть веб-сервер, и у вас есть база данных. У вас также есть кое-что, что вы не сказали нам. Если стадо принадлежит процессу Apache, то это, вероятно, mod_Perl, mod_PHP или подобное. И это первое место, где вы должны искать виновника. Конечно, на PHP единственная вещь, которая блокирует файлы без явного вызова flock() - это обработчик сеанса. Если вы используете PHP и сессии, попробуйте неблокирующий обработчик, в противном случае проверьте ваш код на наличие вызовов flock().
Обратите внимание, что во многих случаях это может быть не тупик, который вы видите, а просто множество медленных сериализованных запросов.
В качестве альтернативы вы можете подумать о том, как предотвратить возникновение созданного вами сценария, ограничив число подключений и запросов на одного клиента.
Ваши MaxClients установлены слишком высоко. Формула для определения настроек:
(Total RAM – yMB)/xMB = MaxClients
где x
средний размер процесса Apache y
сколько памяти вы хотите оставить доступной для других процессов. С вашими номерами и даже с небольшим выделением 500M для других процессов вы получите:
(4000-500)/20=175
Когда количество ваших запросов превысит это, ваш сервер начнет переключаться на диск, время отклика увеличится до нескольких минут, и, наконец, ваш сервер умрет мучительной смертью. Примечание: "запрос" генерируется для каждого ресурса на веб-странице (т.е..htm, каждого.css, каждого файла изображения и т. Д. И т. Д.), Так что всего несколько "посещений" страницы (или, может быть, только один) могут чтобы вы достигли предела!
Установите его на 100 и посмотрите, что произойдет. И пока вы находитесь, верните остальные настройки по умолчанию, если не ниже. Например:
StartServers 2
MinSpareServers 2
MaxSpareServers 10
наверное лучше.