每当我使用“AB”到基准Web服务器,它会在已经发送大量请求后冻结了一会儿,只有20秒左右后继续。
请看下面的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基准。