Ужасные результаты Apache Bench на пользовательской CMS

Обратите внимание: это не жалоба на некачественную CMS.

Просто играл с Apache Bench и получил ужасные результаты с нашей пользовательской CMS, точнее я получил:

Requests per second:    0.37 [#/sec] (mean)

Когда я запускаю еще один тест с простым php-файлом, я получаю:

Requests per second:    4786.07 [#/sec] (mean)

Еще один тест с предыдущей версией CMS:

Requests per second:    6068.66 [#/sec] (mean)

Веб-сайт(ы) работают нормально, проблем не обнаружено, инструменты Google для веб-мастеров сообщают, что наши сайты работают быстрее, чем 80% страниц, что, я думаю, нормально.

Тест был:

ab -t 30 -c 10 http://example.com/

Может проблема с апачем? Плохая конфигурация .htaccess или что-то подобное?

Обновление:

Только что провел простой тест с сокетами, и результаты аналогичны. Страница грузится очень-очень медленно. Если я запустил свой скрипт с другим веб-сайтом, все в порядке.

Кроме того, есть небольшой совет о проблеме с длиной фрагмента. (Плохие заголовки Apache или окончания строк?)

Сайт заархивирован, и когда включено подробное ведение журнала, я вижу в ответе следующие строки:

LOG: Response code = 200
LOG: header received:
HTTP/1.1 200 OK
Date: Tue, 04 Oct 2011 13:10:49 GMT
Server: Apache
Set-Cookie: PHPSESSID=ibnfoqir9fee2koirfl5mhm633; path=/
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

2ef6

Всегда на одном и том же месте, в середине HTML-кода, затем снова <!DOCTYPE HTML>.

Пожалуйста помоги.

Обновление №2:

Только что проверил заголовки HTTP с помощью Rex Swain's HTTP Viewer и получил следующие результаты:

HTTP/1.1·200·OK(CR)(LF)
Date:·Wed,·05·Oct·2011·08:33:51·GMT(CR)(LF)
Server:·Apache(CR)(LF)
Set-Cookie:·PHPSESSID=n88g3qcvv9p6irm1fo0qfse8m2;·path=/(CR)(LF)
Expires:·Sat,·26·Jul·1997·05:00:00·GMT(CR)(LF)
Cache-Control:·no-store,·no-cache,·must-revalidate(CR)(LF)
Pragma:·no-cache(CR)(LF)
Cache-Control:·post-check=0,·pre-check=0(CR)(LF)
Vary:·Accept-Encoding(CR)(LF)
Connection:·close(CR)(LF)
Transfer-Encoding:·chunked(CR)(LF)
Content-Type:·text/html;·charset=UTF-8(CR)(LF)
(CR)(LF)

Вы замечаете что-нибудь необычное?


person fabrik    schedule 28.09.2011    source источник
comment
Вы проверили журналы сервера и CMS?   -  person palacsint    schedule 07.10.2011
comment
Вы можете сначала проверить, возникает ли проблема на стороне клиента или сервера. Затем изолируйте проблему (проблемы) с помощью дихотомического подхода, чтобы изолировать основную проблему.   -  person hornetbzz    schedule 09.10.2011
comment
@palacsint Логи в порядке, все нормально.   -  person fabrik    schedule 10.10.2011
comment
@hornetbzz Когда я открываю сайт в браузере, все нормально (никаких признаков слабой работы). Запуск apachebench (тот же сервер или другой, без различий) или получение его с помощью простого теста сокетов — результаты ужасны.   -  person fabrik    schedule 10.10.2011


Ответы (1)


Если он хорошо работает с обычными веб-браузерами (как вы упомянули в комментариях), 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 не использует поддержку активности, поэтому он ждет, когда придет ответ для закрытия сокета. Сервер закрывает его после 15 секунд простоя. Загрузка главной страницы с помощью wget также занимает 15 секунд. Wget также использует HTTP 1.0 в запросе.

Я думаю, что это ошибка в коде PHP CMS, поскольку ab хорошо работает на том же сервере с простым файлом php. В любом случае, вы можете обойти это, используя поддерживающие соединения (-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), и клиенты с обычными браузерами ее не заметят.

person palacsint    schedule 10.10.2011
comment
Пробовал оба, но, к сожалению, безуспешно. Просто меньше RPS (0,07/сек) - person fabrik; 11.10.2011
comment
Покажите исходный запрос (из браузера) и параметры Apache Benchmark. Может просто опечатка. И проверьте обновление, пожалуйста. - person palacsint; 11.10.2011
comment
исходный тестовый запрос: ab -t 30 -c 10 http://popnroll.hu/ банкомат исследует ваше обновление. - person fabrik; 11.10.2011
comment
измерение времени выполнения в error_log, отображающее точно такую ​​​​же метку времени как в первой, так и в последней строке. - person fabrik; 11.10.2011
comment
Попробуйте ab -k. Я не знаю, почему это так быстрее (пока). - person palacsint; 11.10.2011
comment
Сам мой первоначальный запрос был проблемой? - person fabrik; 11.10.2011
comment
Проверка с помощью HTTPerf или Chrome devtools говорит, что представлен заголовок Keep-Alive. - person fabrik; 11.10.2011
comment
Я думаю, что HTTPerf отправляет запросы HTTP 1.1, а не 1.0. Свяжитесь с wget -S. - person palacsint; 11.10.2011
comment
Извините, я не понимаю. Как я могу правильно настроить сайт под HTTP/1.0? - person fabrik; 11.10.2011
comment
Проверьте обновление. Я завершил свои примеры с полными ab командными строками. - person palacsint; 11.10.2011
comment
первый потерпел неудачу с Test aborted after 10 failures, но второй делает 223 RPS. Так это обходной путь для Apachebench? Кстати, в моем коде все еще есть ошибка? - person fabrik; 11.10.2011
comment
Да, у меня тоже работает вторая команда. Да, где-то ошибка. Apache Benchmark должен хорошо работать без параметров -k и -H. Это может быть ошибка PHP или Apache или неправильная конфигурация, но я понятия не имею, что может вызвать такое поведение. Это CMS с открытым исходным кодом или общедоступная? - person palacsint; 11.10.2011
comment
Это определенно ошибка в исходном коде CMS (а не ошибка PHP или Apache). Я только что заметил, что ab хорошо работает с простым php-скриптом на том же сервере. (Я тоже обновил ответ.) - person palacsint; 11.10.2011