Правильный real-time мониторинг системы, дело не такое простое, как может показаться на первый взгляд.
Самый распространенный пример — измерение времени отклика сервера на запрос. Допустим у нас всё есть:
— сервер для каждого запроса вычисляет execution time, складывает в счётчик
— сервер умеет отдавать значение счётчика по внешнему запросу
— есть monitoring сервер который собирает значения каждый poll interval, хранит, агрегирует и рисует графики
Решение в лоб — измерять мгновенное значение счётчика — особого смысла не имеет, при poll interval в одну или пять минут, мы получим мгновенное значение производительности системы измеренное по последнему запросу. Если все 5 минут до этого исполнялись запросы по 2секунды или больше, а последний был легкий на 20ms мы увидим только 20ms. Или наоборот.
Стандартное решение — скользящее среднее по последним N запросам. Решение работает замечательно, пока N запросов выполняются за время меньшее poll interval. Если нагрузка падает, получается вот такое вот:
Между полночью и 4-мя часами утра либо не было запросов вовсе, либо было меньше N. Значение скользящего среднего не менялось и создаётся обманчивое впечатление, что сервер обрабатывал все запросы за 6ms.
Ниже, тот же счётчик, только с другого сервера где скользящее среднее было модифицировано.
Картина видна гораздо лучше. Видно где были запросы, а где не было.
Модификация довольно простая. Кроме параметра N — размера окна для скользящего среднего. Вводится ещё один параметр — T, время забывания (expiration time), все значения в окне, старше T не учитываются при подсчёте среднего.
Выбор T (ms) для данного значения poll interval (ms) — это другая интересная проблема.
Если T << poll interval, (много меньше) будут потерянные значения
Если T >> poll interval, (много больше) будет график #1
В первом приближении, можно принять T = 2 * poll interval
Самый распространенный пример — измерение времени отклика сервера на запрос. Допустим у нас всё есть:
— сервер для каждого запроса вычисляет execution time, складывает в счётчик
— сервер умеет отдавать значение счётчика по внешнему запросу
— есть monitoring сервер который собирает значения каждый poll interval, хранит, агрегирует и рисует графики
Решение в лоб — измерять мгновенное значение счётчика — особого смысла не имеет, при poll interval в одну или пять минут, мы получим мгновенное значение производительности системы измеренное по последнему запросу. Если все 5 минут до этого исполнялись запросы по 2секунды или больше, а последний был легкий на 20ms мы увидим только 20ms. Или наоборот.
Стандартное решение — скользящее среднее по последним N запросам. Решение работает замечательно, пока N запросов выполняются за время меньшее poll interval. Если нагрузка падает, получается вот такое вот:
Между полночью и 4-мя часами утра либо не было запросов вовсе, либо было меньше N. Значение скользящего среднего не менялось и создаётся обманчивое впечатление, что сервер обрабатывал все запросы за 6ms.
Ниже, тот же счётчик, только с другого сервера где скользящее среднее было модифицировано.
Картина видна гораздо лучше. Видно где были запросы, а где не было.
Модификация довольно простая. Кроме параметра N — размера окна для скользящего среднего. Вводится ещё один параметр — T, время забывания (expiration time), все значения в окне, старше T не учитываются при подсчёте среднего.
Выбор T (ms) для данного значения poll interval (ms) — это другая интересная проблема.
Если T << poll interval, (много меньше) будут потерянные значения
Если T >> poll interval, (много больше) будет график #1
В первом приближении, можно принять T = 2 * poll interval