Ilekroć używam "ab" do testowania serwera WWW, będzie on blokował się przez pewien czas po wysłaniu dużej liczby żądań, aby kontynuować po 20 sekundach.Program "ab" zawiesza się po wielu prośbach, dlaczego?
Rozważmy następujący symulator serwera HTTP, napisany w 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
Następnie uruchom ab następująco:
ab -n 45000 -c 10 http://127.0.0.1:3000/
ciągu pierwszych kilku sekund, ab wykonuje swoją pracę jak to miało i używa 100% procesora:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
Po około 13500 żądaniach zużycie procesora systemowego spada o 0%. ab wydaje się być na coś zamrożony. Problem nie znajduje się na serwerze, ponieważ w tej chwili serwer wywołuje funkcję accept(). Po około 20 sekundach ab kontynuuje, jak gdyby nic się nie stało, i ponownie użyje 100% CPU, tylko po to, aby zamrozić ponownie po kilku sekundach.
Podejrzewam, że coś w jądrze dławi połączenia, ale co i dlaczego? Używam systemu OS X Leopard. Podobne zachowanie zaobserwowałem również w Linuksie, choć zamrożenie odbywa się przy znacznie większej liczbie żądań i nie zdarza się tak często.
Ten problem uniemożliwia mi wykonywanie dużych testów porównawczych HTTP.
Tak, to wszystko. Zmieniłem MSL postępując zgodnie z instrukcjami na http://www.brianp.net/2008/10/03/changing-the-length-of-the-time_wait-state-on-mac-os-x/ i wszystko działa teraz. Dzięki! – Hongli
Dziękuję bardzo, to naprawił ten sam problem, który miałem. –
Tutaj myślałem, że to problem 'Golang' .. kiedy zamroził co 16000 wniosków z' ab' – kouton