每當我使用'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