Очень высокое начальное время отклика 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, изолируя любые проблемы, связанные с кодом в другом процессе.

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