Очень высокое начальное время отклика Apache 2, без нагрузки на систему
Недавно я заметил, что VPS, который я администрирую, имеет странное поведение Apache. По сути, любой HTTP-запрос зависает примерно на секунду, прежде чем он фактически будет обработан.
Выход из ab
показывает что-то вроде этого:
$ ab -n 10 -c 1 http://server-public-ip/path-to-static-file
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
<snipped>
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 3.5 0 11
Processing: 2 1373 1784.6 1000 4854
Waiting: 2 1372 1784.6 1000 4854
Total: 2 1374 1784.4 1011 4854
<snipped>
Первоначально я думал, что мой сайт mod_perl работает медленно, но он работает на статически обслуживаемом файле! Мой конфиг виртуального хоста выглядит так:
<VirtualHost server-ip:80>
<Location />
DefaultType text/html
Order deny,allow
Allow from all
SetHandler perl-script
PerlHandler HTML::Mason::ApacheHandler
PerlSetVar MasonDataDir "/var/tmp/mason-cache"
PerlSetVar MasonCompRoot "<path-to-comproot>"
ReWriteEngine on
ReWriteRule ^(.*)/$ $1/index
ErrorDocument 404 /not_found
</Location>
<Location /static>
Order deny,allow
Allow from all
SetHandler default-handler
</LocationMatch>
</VirtualHost>
Существует много свободной памяти (по крайней мере, 32 МБ полностью свободно, т.е. не используется для кэширования), много ресурсов процессора (средняя загрузка составляет 0,00 на 1/5/15-минутных окнах), доступно много дискового ввода-вывода (средний диск передача составляет менее 5 кб / с) .,, Я понятия не имею, в чем может быть проблема. После начала передачи он работает на полной скорости (более 2 МБ / с, что примерно соответствует пределу моего локального подключения.)
Я использую стабильную версию Debian, использую ядро 2.6.32 и Apache 2.2.16 (используя prefork). На сервер практически не поступает трафик, и я попытался настроить параметры prefork в обоих направлениях (от множества свободных рабочих до лишних рабочих) .
Какие-нибудь мысли?
1 ответ
Имейте в виду, что даже если у вас есть отдельные обработчики для разных путей, дочерние элементы prefork повторно используются на основе вашего MaxRequestsPerChild
установка. Это означает, что дочерний процесс может в итоге обработать запрос к обработчику perl, прежде чем он обработает один запрос к статическому содержимому (особенно если у вас есть балансировщик нагрузки с проверкой работоспособности по отношению к обработчику perl). Если в Perl есть какая-то особенность, которая суммирует работы, он может скопировать статический контент при последующих запросах.
По этой и другим причинам на прежнем рабочем месте у нас была практика изоляции статического контента от собственного процесса httpd и использования балансировщика нагрузки для разделения трафика между ними на основе контекста URI. Второй веб-сервер даже не загружает mod_perl, изолируя любые проблемы, связанные с кодом в другом процессе.