Chaque fois que j'utilise " ab " à la référence d'un serveur web, il va geler pendant un certain temps après avoir envoyé de nombreuses demandes, uniquement pour continuer après 20 secondes.
Considérez les points suivants serveur HTTP simulateur, écrit en 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
Je puis exécutez ab comme suit:
ab -n 45000 -c 10 http://127.0.0.1:3000/
Pendant les premières secondes, ab fait son travail comme il est censé le faire et utilise 100% du CPU:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
Après environ 13500 demandes, système d'utilisation de l'UC tombe à 0%. ab semble bloqué sur quelque chose. Le problème n'est pas dans le serveur, car à ce moment, le serveur appelle accept(). Après environ 20 secondes ab continue comme si de rien n'était, et utilise 100% du CPU de nouveau, seulement pour geler à nouveau au bout de quelques secondes.
Je soupçonne que quelque chose dans le noyau de la limitation des connexions, mais quoi et pourquoi? Je suis l'aide de mac OS X Leopard. J'ai vu un comportement similaire sur Linux, bien que le gel se produit à un plus grand nombre de demandes et n'arrive pas si souvent.
Ce problème m'empêche de courir grand HTTP repères.