Если он хорошо работает с обычными веб-браузерами (как вы упомянули в комментариях), CMS по-разному обрабатывает запросы от Apache Benchmark.
Быстрый контрольный список:
- AFAIK Apache Benchmark просто отправляет простые запросы без какой-либо обработки файлов cookie, поэтому попробуйте установить
-C
с допустимым файлом cookie (скопируйте значения из веб-браузера).
- Попробуйте отправить в CMS точно такие же заголовки, как отправляет веб-браузер. Сохраните дамп действительного запроса с помощью netcat, HttpFox или анализатора пакетов и установите отсутствующие заголовки с помощью
-H
.
- Профилируйте CMS на сервере, пока вы отправляете ему запрос с помощью Apache Benchmark. Может быть, вы нашли узкое место. Два вызова error_log бедного человека с отметкой времени в первой и последней строке
index.php
(или точки входа тестируемого сценария) могут показать, насколько быстрым является сценарий PHP, и помочь рассчитать накладные расходы HTTP-сервер Apache и сеть.
- Если вы запускаете тесты сокетов и тесты браузера на разных компьютерах, это может быть проблемой DNS (отключите
HostnameLookups
в Apache). Попробуйте запустить их с той же машины.
- Попробуйте
ab -k ...
или ab -H "Connection: close" ...
.
Я предполагаю, что CMS выполняет дорогостоящую инициализацию, когда инициализирует сеанс, и это происходит, когда он обрабатывает первый запрос. Поскольку Apache Benchmark не отправляет файлы cookie обратно в CMS, он создает новый сеанс для каждого запроса и является причиной медленных ответов.
Второе предположение заключается в том, что CMS по-разному обрабатывает входящие заголовки http, а заголовки, отправленные (или их отсутствие) Apache Benchmark, вызывают некоторую дорогостоящую / медленную обработку. Это выглядит более уместно, так как в отчете Google Webmaster Tools.
Apache Benchmark отправляет запрос HTTP 1.0, например:
GET / HTTP/1.0
Host: localhost:9100
User-Agent: ApacheBench/2.3
Accept: */*
Мне кажется, что ваш сервер не отправляет заголовок http о настройках Keep-Alive, но предполагает, что клиент использует keep-alive, когда клиент использует HTTP 1.0. Это не RFC-совместимое поведение:
С RFC 2616, 19.6.2 Совместимость с постоянными соединениями HTTP / 1.0 :
Некоторые клиенты и серверы могут захотеть быть совместимыми с некоторыми
предыдущие реализации постоянных соединений в HTTP / 1.0
клиенты и серверы. Постоянные соединения в HTTP / 1.0
явно согласовано, так как они не являются поведением по умолчанию.
По умолчанию Apache Benchmark не использует keep-alive, поэтому он ждет, когда придет ответ для закрытия сокета. Сервер закрывает его после 15 секунд простоя. Загрузка главной страницы с помощью wget также занимает 15 секунд. Wget также использует HTTP 1.0 в запросе.
Я думаю, что это ошибка в PHP-коде CMS, поскольку ab
хорошо работает на том же сервере с простым php-файлом. В любом случае, вы можете обойти это, используя keep-alive соединения (-k
):
ab -k -t 30 -c 10 http://example.com/
или с явным отключением постоянных соединений:
ab -H "Connection: close" -t 30 -c 10 http://example.com/
но это все еще проблема на стороне сервера, и ваши оригинальные ab
команды верны.
Обратите внимание, что эта ошибка, вероятно, затрагивает только клиентов HTTP 1.0 (например, Apache Benchmark, wget), и клиенты с обычными браузерами этого не заметят.