Apache 2 初始响应时间极高,无系统负载

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>

有足够的内存可用(至少 32MB 完全可用,即不用于缓存),大量的处理器资源(1/5/15 分钟窗口上的平均负载为 0.00),大量的磁盘 I/O 可用(磁盘传输中位数小于 5 KB/s)... 我不知道问题可能是什么。传输开始后,它会全速运行(超过 2MB/s,这大约是我本地连接的极限。)

我使用的是 Debian 稳定版,运行 2.6.32 内核和 Apache 2.2.16(使用 prefork)。几乎没有流量进入服务器,我尝试在两个方向上调整 prefork 设置(大量备用工作进程到没有备用工作进程)。

有什么想法吗?

答案1

请记住,即使您为不同的路径设置了单独的处理程序,prefork 子进程也会根据您的MaxRequestsPerChild设置重复使用。这意味着子进程可能先处理对 perl 处理程序的请求,然后再处理对静态内容的请求(特别是如果您有一个针对 perl 处理程序进行健康检查的负载平衡器)。如果 Perl 中存在导致工作中断的怪癖,则它可能会在后续请求中中断静态内容。

出于这个和其他原因,在以前的工作场所,我们习惯将静态内容隔离到其自己的 httpd 进程中,并使用负载平衡器根据 URI 上下文在两者之间分配流量。第二个 Web 服务器甚至从不加载 mod_perl,从而将代码引入的任何问题隔离到另一个进程。

相关内容