У меня есть простой скрипт PHP, работающий на Apache 2.2 (конфигурация почти по умолчанию). При запуске команды ab -n 1 <address>
где адрес - это либо локальный IP-адрес, либо имя домена, я получаю примерно 15-секундное окно, в котором сокет остается открытым после получения всех данных за первую секунду или около того.
Когда я открываю ту же страницу в браузере, я получаю ответы менее 100 мс. Я понимаю, что большинство современных браузеров поддерживают заголовок Keep-Alive и сохраняют постоянные соединения с каким-то таймером TTL. Итак, когда я запустил ab -kn <whatever>
, я начал получать результаты, близкие к тем, которые я ожидал от производительности через браузер.
Это нормальное поведение? Что-то не так с конфигурацией моего сервера?
[РЕДАКТИРОВАТЬ]
Я побежал ab
снова с -v 2
флаг, это был результат:
Benchmarking localhost (be patient)...INFO: POST header ==
---
GET <PATH> HTTP/1.0
Host: localhost
User-Agent: ApacheBench/2.3
Accept: */*
---
LOG: header received:
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 05:09:42 GMT
Server: Apache/2.2.16 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 86
Content-Type: text/html
<html><head><title>Dynamic</title><body><h1>This is another action!</h1></body></html>
..done
Server Software: Apache/2.2.16
Server Hostname: localhost
Server Port: 80
Document Path: <PATH>
Document Length: 86 bytes
Concurrency Level: 1
Time taken for tests: 15.076 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 242 bytes
HTML transferred: 86 bytes
Requests per second: 0.07 [#/sec] (mean)
Time per request: 15075.916 [ms] (mean)
Time per request: 15075.916 [ms] (mean, across all concurrent requests)
Transfer rate: 0.02 [Kbytes/sec] received
Однако браузеры также принимают Content-Encoding: gzip
и длина содержимого 97 из сжатия zlib в php - и, возможно, с помощью функции дефляции Apache 2.2. 15-секундная пауза происходит после отправки всего тела, перед ..done
.
Я думаю, вы спрашиваете: "Это нормально для ab -n 1
дождаться разрыва соединения (15 секунд) перед возвратом, даже если сервер немедленно отправит все ваши данные? "
Это ненормально.
Выполнить с детализацией = 2 (ab -v 2 <url>
) и проверьте возвращаемые заголовки. Сервер отправляет соединение: закрыто? Он отправляет неверную Content-Length?
[РЕДАКТИРОВАТЬ]
Теперь я вижу, что ваше тело представляет собой одну линию, поэтому, возможно, ab недоволен тем, что не получил CR LF после тела объекта. Я не могу воспроизвести такой вывод с помощью apache и текстового файла - apache добавляет CR LF после тела, а ab немедленно возвращается. Как вы производите эту продукцию?
Сработало для меня после того, как я добавил эти заголовки в ответ сервера
Подключение: Keep-Alive Content-Length: xxx
Как ни странно, если я не добавляю заголовок «Соединение», время ожидания ab в режиме «-k». Похоже какая-то ошибка в реализации.