Всякий раз, когда я использую "ab" для тестирования веб-сервера, он некоторое время замерзает после отправки большого количества запросов, только для продолжения через 20 секунд или около того.
Рассмотрим следующий симулятор HTTP-сервера, написанный на 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
Затем я запускаю ab следующим образом:
ab -n 45000 -c 10 http://127.0.0.1:3000/
В течение первых нескольких секунд ab выполняет свою работу по своему усмотрению и использует 100% процессор:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
После примерно 13500 запросов загрузка системного процессора падает до 0%. Кажется, что что-то замерзло. Проблема не в сервере, потому что на данный момент сервер вызывает accept(). Примерно через 20 секунд ab продолжает, как будто ничего не происходит, и снова будет использовать 100% CPU, только чтобы снова заморозить через несколько секунд.
Я подозреваю, что что-то в ядре регулирует соединения, но что и почему? Я использую OS X Leopard. Я тоже видел подобное поведение в Linux, хотя замораживание происходит при гораздо большем числе запросов и не происходит так часто.
Эта проблема не позволяет мне запускать большие тесты HTTP.