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

наверное лучше.

Другие вопросы по тегам