Bất cứ khi nào tôi sử dụng 'ab' để đánh giá một máy chủ web, nó sẽ đóng băng một lúc sau khi đã gửi nhiều yêu cầu, chỉ để tiếp tục sau 20 giây hoặc lâu hơn.Chương trình 'ab' bị đóng băng sau nhiều yêu cầu, tại sao?
Hãy xem xét các mô phỏng máy chủ HTTP sau, viết bằng 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
sau đó tôi chạy ab như sau:
ab -n 45000 -c 10 http://127.0.0.1:3000/
Trong vài giây đầu tiên, ab làm công việc của mình vì nó là nghĩa vụ phải và sử dụng CPU 100%:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
Sau khoảng 13500 yêu cầu, mức sử dụng CPU hệ thống giảm o 0%. ab dường như bị đóng băng trên một cái gì đó. Vấn đề không có trong máy chủ bởi vì tại thời điểm này, máy chủ đang gọi accept(). Sau khoảng 20 giây ab tiếp tục như thể không có gì xảy ra, và sẽ sử dụng CPU 100% một lần nữa, chỉ để đóng băng lại sau vài giây.
Tôi nghi ngờ điều gì đó trong hạt nhân đang điều chỉnh các kết nối, nhưng điều gì và tại sao? Tôi đang sử dụng OS X Leopard. Tôi đã nhìn thấy hành vi tương tự trên Linux là tốt, mặc dù đóng băng xảy ra ở một số lượng lớn hơn nhiều yêu cầu và không xảy ra quá thường xuyên.
Sự cố này ngăn tôi chạy các tiêu chuẩn HTTP lớn.
Vâng, đúng vậy. Tôi đã thay đổi MSL bằng cách làm theo các hướng dẫn tại http://www.brianp.net/2008/10/03/changing-the-length-of-the-time_wait-state-on-mac-os-x/ và mọi thứ hoạt động hiện nay. Cảm ơn! – Hongli
Cảm ơn rất nhiều, điều này cố định cùng một vấn đề tôi đã gặp phải. –
Ở đây tôi đã nghĩ đó là một vấn đề 'Golang' .. khi nó đóng băng mỗi 16000 yêu cầu từ' ab' – kouton