Измерение времени отклика страницы для разных серверов в веб-ферме (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" означает, что последний заголовок ответа (пустая строка) никогда не был виден, скорее всего из-за истечения времени ожидания сервера до того, как серверу удалось обработать запрос.