极高的apache 2初始响应时间,没有系统负载

我最近注意到,我pipe理的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网站运行缓慢,但这是运行在一个静态的服务文件! 我的虚拟主机configuration如下所示:

 <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> 

有足够的内存空间(至less32MB完全免费,即不用于caching),大量的处理器资源(在1/15/15分钟的窗口上平均负载为0.00),大量的磁盘I / O可用(中等磁盘传输小于5 KB / s)。 。 。 我不知道问题可能是什么。 传输开始后,全速运行(大于2MB / s,这大约是我本地连接的限制)。

我正在使用Debian stable,运行2.6.32内核和Apache 2.2.16(使用prefork)。 几乎没有任何stream量进入服务器,我尝试调整双向prefork设置(大量的备用工人,没有备用工人)。

有什么想法吗?

请记住,即使您有不同path的单独处理程序,prefork子级也会根据您的MaxRequestsPerChild设置重新使用。 这意味着一个孩子最终可能会在向一个静态内容提供服务之前(特别是如果您有一个负载均衡器,并且对perl处理程序有一个运行状况检查),则会向perl处理程序提供服务。 如果在Perl中存在一个怪异的东西,就会在后续的请求中粘上静态内容。

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