Bir web sunucusunu karşılaştırmak için 'ab' kullandığımda, çok fazla istek gönderildikten sonra bir süre donacak ve yalnızca 20 saniye sonra devam edecek. aşağıdaki gibi'ab' programı birçok istekten sonra donuyor, neden?
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
Sonra ab çalıştırın::
Ruby ile yazılmış aşağıdaki HTTP sunucusu simülatörü, düşünün o gerekiyordu olarak ilk birkaç saniye boyunca
ab -n 45000 -c 10 http://127.0.0.1:3000/
, ab işini yapar ve% 100 CPU kullanır:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
Yaklaşık 13500 istekten sonra, sistem CPU kullanımı düşer. 0%. ab bir şey üzerinde donmuş görünüyor. Sorun şu anda sunucuda değil, sunucu şu anda kabul ediyor(). Yaklaşık 20 saniye sonra, hiçbir şey olmamış gibi devam eder ve tekrar birkaç saniye sonra tekrar dondurmak için tekrar% 100 CPU kullanır.
Çekirdeğindeki bir şeyin bağlantılar arasında sıkıştığından şüpheleniyorum, ama ne ve neden? OS X Leopard kullanıyorum. Dondurucunun çok daha fazla sayıda istekte bulunmasına ve sık sık gerçekleşmemesine rağmen, Linux'ta da benzer davranışlar gördüm.
Bu sorun, büyük bir HTTP karşılaştırması yapmamı engelliyor.
Evet, işte bu kadar. MSL'yi http://www.brianp.net/2008/10/03/changing-the-length-of-the-time_wait-state-on-mac-os-x/ adresindeki talimatları izleyerek değiştirdim ve her şey çalışıyor şimdi. Teşekkürler! – Hongli
Çok teşekkürler, bu benim yaşadığım aynı sorunu çözdü. –
Burada bir 'Golang' problemi olduğunu düşünüyordum .. 'ab' den gelen her 16000 isteğin donduğunda – kouton