Назад | Перейти на главную страницу

Тестирование производительности Apache Keep-Alive

У меня есть простой скрипт 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». Похоже какая-то ошибка в реализации.