ApacheBench:请求时间进入以太网

我有一个Apache服务器,通过mod_jk代理到Tomcat。 我已经在Apache中设置了一个自定义日志来logging访问时间:

LogFormat "%h %l %u %t \"%r\" %>s %b %D" transfertimes CustomLog /path/to/transfer-times.log transfertimes 

我正在Web服务器上运行ApacheBench。 我注意到,随着并发的增加,我的第99个百分点的请求时间似乎呈指数级增长,尽pipe第50百分位保持相对稳定。 作为一个例子,ApacheBench会说大约10个1000的请求需要1秒以上的并发级别100来响应。

但是,当我查看transfer-times.log时,根据LogFormat中的%D,没有请求显示为大于1秒。 我试图找出什么会导致Apache日志和ApacheBench报告的访问时间之间的差距。 通常我可以将它归因于networking延迟,但是我在一台主机上运行。 我认为必须有一些古怪的Linux TCP参数或文件描述符,我需要调整,但我不知道从哪里开始。

可能它实际上并不是apache需要这么长的时间来请求服务,但是你遇到了OS已经定义的其他限制。

看看netstat给你的接受连接的数量,很可能你会发现apache看到的请求数量有很大的不同(因此在apache知道的时间内服务)和请求数量操作系统已经可以照顾。

 netstat -tulpen 

可能在这里有帮助。 还要看看sysctl告诉你的限制,甚至是iptables。

我很抱歉,我不记得任何细节,因为我遇到这样的问题已经有一段时间了。

我认为你的外围请求是由于apache或者mod_jk越区切换中的工作人员不足而导致的。

为了在apache和tomcat之间正确的代理,你需要设置tomcat连接器来处理和apache分叉的孩子一样多的连接。 如果你不apache将不得不阻止等待tomcat释放连接。 这可能会导致额外的阻塞,因为那些在tomcat上等待的工作人员将无法处理传入的连接。

http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html

PS。 不要把%D当作福音。 它只测量apache孩子开始工作之间的时间(所以不计算接受/分岔/切换持续时间)和最后一个字节通过send()因为操作系统缓冲而高度可变)。

PPS。 调整AJP是一种黑色的艺术,恕我直言,AJP的好处(稍微容易parsing请求,持久连接)不再是足够的理由避免直接的HTTP代理。