Immer, wenn ich 'ab' verwende, um einen Webserver zu benchmarken, wird er eine Zeit lang eingefroren, nachdem er viele Anfragen gesendet hat, nur um nach etwa 20 Sekunden fortzufahren.'ab' Programm friert nach vielen Anfragen ein, warum?
den folgenden HTTP-Server Simulator Betrachten wir in Ruby geschrieben:
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
ich dann ab laufen wie folgt:
ab -n 45000 -c 10 http://127.0.0.1:3000/
Während der ersten paar Sekunden, tut ab, seine Arbeit als es soll und verwendet 100% CPU:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
Nach etwa 13500 Anfragen sinkt System CPU-Auslastung t o 0%. ab scheint auf etwas eingefroren zu sein. Das Problem liegt nicht auf dem Server, da der Server in diesem Moment accept() aufruft. Nach etwa 20 Sekunden wird der Vorgang fortgesetzt, als ob nichts passiert wäre, und er wird wieder 100% CPU verwenden, nur um nach einigen Sekunden wieder einzufrieren.
Ich vermute, etwas im Kernel drosselt Verbindungen, aber was und warum? Ich benutze OS X Leopard. Ich habe ähnliches Verhalten auch unter Linux gesehen, obwohl das Einfrieren bei einer viel größeren Anzahl von Anfragen passiert und nicht so häufig vorkommt.
Dieses Problem verhindert, dass ich große HTTP-Benchmarks ausführen.
Ja, das ist es. Ich änderte das MSL, indem ich die Anweisungen an http://www.brianp.net/2008/10/03/changing-the-length-of-the-time_wait-state-on-mac-os-x/ befolgte und alles funktioniert jetzt. Vielen Dank! – Hongli
Vielen Dank, dies behebt das gleiche Problem, das ich hatte. –
Hier dachte ich, es sei ein 'Golang'-Problem ... als es alle 16000 Anfragen von 'ab' einfror – kouton