每当我使用'ab'来对一个web服务器进行基准测试时,它会在发送很多请求后冻结一段时间,只有在20秒左右之后才会继续。'ab'程序在多次请求后会冻结,为什么?
考虑下面的HTTP服务器仿真器,用Ruby写的:
require 'socket'
RESPONSE = "HTTP/1.1 200 OK\r\n" +
"Connection: close\r\n" +
"\r\n" +
"\r\n"
buffer = ""
server = TCPServer.new("127.0.0.1", 3000) # Create TCP server at port 3000.
server.listen(1024) # Set backlog to 1024.
while true
client = server.accept # Accept new client.
client.write(RESPONSE) # Write a stock "HTTP" response.
client.close_write # Shutdown write part of the socket.
client.read(nil, buffer) # Read all data from the socket.
client.close # Close it.
end
我然后运行AB如下:
ab -n 45000 -c 10 http://127.0.0.1:3000/
在最初的几秒钟,AB,它的工作,因为它的应该并且使用100%的CPU:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
约13500的请求后,系统CPU使用率下降吨○0%。 ab似乎被冻结在某物上。问题不在服务器中,因为此时服务器正在调用accept()。大约20秒后ab继续,好像什么也没有发生,并且会再次使用100%的CPU,只有在几秒钟后再次冻结。
我怀疑内核中的东西是限制连接,但是什么?为什么?我使用的是OS X Leopard。我也在Linux上看到过类似的行为,尽管冻结发生在更多的请求中,并且不经常发生。
此问题阻止我运行大型HTTP基准测试。
是的,就是这样。我按照http://www.brianp.net/2008/10/03/changing-the-length-of-the-time_wait-state-on-mac-os-x/上的说明更改了MSL,并且一切正常现在。谢谢! – Hongli 2009-08-02 11:58:38