Измерение времени отклика страницы для разных серверов в веб-ферме (HAProxy?)

Я строю небольшую ферму веб-серверов (IIS7.5) для обслуживания внутреннего веб-сайта. Одна из вещей, которые я хочу измерить, это то, каково время ответа HTTP между пользовательскими запросами и обслуживаемой страницей.

Учитывая, что я использую HAProxy в качестве внешнего балансировщика нагрузки, вполне естественно, что HAProxy будет в идеальном месте для сбора этой информации, так как он находится между каждым запросом / ответом. Однако, глядя на сгенерированную страницу статистики, есть много полезной информации, но я не вижу ничего о времени отклика.

Каков наилучший способ сделать это? Это функция, которую может выполнять HAProxy, или мне нужно другое специализированное программное обеспечение для мониторинга?

3 ответа

Решение

HAProxy предоставляет очень подробную статистику обо всех HTTP-запросах. Намного больше, чем вы видите на странице статистики.

Вам необходимо настроить сервер системного журнала, прослушивающий UDP-сообщения системного журнала (например, на локальном хосте). Этот сервер системного журнала должен быть настроен на запись сообщений журнала, полученных HAProxy, в файл (или где угодно). Пример конфигурации HAproxy может выглядеть так:

defaults
  # send the logs to localhost:514 via UDP, using the local0 facility
  log 127.0.0.1 local0 debug
  option httplog

  mode http
  balance roundrobin

listen farm
  bind 10.0.0.1:80

  server iis1 10.0.1.1:80
  server iis2 10.0.1.2:80

См. Раздел 8 руководства по конфигурации для получения подробной информации о формате журнала и о том, как его настроить.

Никакого системного журнала не требуется, функция экспорта CSV со страницы статистики предоставляет все детали.

$ lynx -source -auth=STATSUSER:STATSPASSWORD 'http://haproxy/stats;csv' | cut -d ',' -f 2,8,61

Поля 2,8 и 61 будут отображать имя сервера, общее количество сеансов и среднее время ответа в мс за последние 1024 запроса.

Я использую option httplog clf для регистрации и захвата нескольких дополнительных полей, но вот регулярное выражение Python, которое я написал для этого (что может сэкономить вам некоторое время):

line_regex=re.compile('ny-lb[0-9]{2} (?P<HTTP_CLIENT_IP>[^ ]+) - - \[[^\]]*\] "(?P<HTTP_METHOD>[^ ]+) (?P<HTTP_URI>[^ ]+) (?P<HTTP_VERSION>\w+/\d+\.\d+)" (?P<HTTP_RESPONSE_CODE>\d{3}) (?P<HTTP_HAPROXY_BYTES_READ>\d+) "[^"]*" "[^"]*" [^ ]+ [^ ]+ "(?P<HTTP_HAPROXY_FRONTEND>[^"]+)" "(?P<HTTP_HAPROXY_BACKEND>[^"]+)" "(?P<HTTP_SERVER>[^"]+)" (?P<HTTP_HAPROXY_TQ>-?\d*) (?P<HTTP_HAPROXY_TW>-?\d*) (?P<HTTP_HAPROXY_TC>-?\d*) (?P<HTTP_HAPROXY_TR>-?\d*) (?P<HTTP_HAPROXY_TT>-?\d*) "(?P<HTTP_HAPROXY_TERM_STATE>[^"]*)" (?P<HTTP_HAPROXY_ACTCONN>-?\d*) (?P<HTTP_HAPROXY_FECONN>-?\d*) (?P<HTTP_HAPROXY_BECONN>-?\d*) (?P<HTTP_HAPROXY_SRV_CONN>-?\d*) (?P<HTTP_HAPROXY_RETRIES>-?\d*) (?P<HTTP_HAPROXY_SRV_QUEUE>-?\d*) (?P<HTTP_HAPROXY_BACKEND_QUEUE>-?\d*) "[^"]*" "[^"]*" "(?P<HTTP_REFERER>[^"]*)" "(?P<HTTP_UA>[^"]*)" "(?P<HTTP_HOST>[^"]*)" "(?P<HTTP_X_FORWARD_FOR>[^"]*)"')

Вы, вероятно, хотите поле HTTP_HAPROXY_TR:

Tr: время ответа сервера (только режим HTTP). Это время, прошедшее между моментом установления TCP-соединения с сервером и моментом, когда сервер отправил свои полные заголовки ответа. Он просто показывает время обработки своего запроса без сетевых издержек из-за передачи данных. Стоит отметить, что когда у клиента есть данные для отправки на сервер, например, во время запроса POST, время уже идет, и это может исказить кажущееся время ответа. По этой причине, как правило, не стоит слишком доверять этому полю для запросов POST, инициированных клиентами за ненадежной сетью. Здесь значение "-1" означает, что последний заголовок ответа (пустая строка) никогда не был виден, скорее всего из-за истечения времени ожидания сервера до того, как серверу удалось обработать запрос.

Другие вопросы по тегам