Всякий раз, когда я использую '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% CPU:
Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests
После примерно 13500 запросов загрузка ЦП системы падает до 0%. Аб, кажется, застыл на чем-то. Проблема не в сервере, потому что в этот момент сервер вызывает accept (). Примерно через 20 секунд ab продолжает работу, как будто ничего не произошло, и снова использует 100% ЦП, только через несколько секунд снова останавливается.
Я подозреваю, что что-то в ядре замедляет соединения, но что и почему? Я использую OS X Leopard. Я видел подобное поведение и в Linux, хотя зависание происходит при гораздо большем количестве запросов и не так часто.
Эта проблема не позволяет мне запускать большие тесты HTTP.