понедельник, 15 августа 2016 г.

[prog.thoughts] Как с философической точки зрения лучше снимать статистику активностей?

Предположим, что есть некий актор, который спит при ожидании поступления сообщений, просыпается при поступлении очередного сообщения, обрабатывает его и засыпает вновь. И мы хотим получать некую статистику периодов ожидания.

Создавать историю всех ожиданий не вариант. Т.к. даже за период наблюдения в 1 секунду таких событий может произойти несколько тысяч. Поэтому появилась идея фиксировать статистику по двум временным периодам: по длинному периоду (т.е. от самого начала наблюдений и до текущего момента) и по короткому периоду определенной длины (скажем, в 2 секунды, в этом случае статистика описывает события на глубину в 2 секунды от текущего момента). В статистику входят такие значения, как общее количество событий, суммарная их длительность, минимальные и максимальные значения.

Допустим, мы с толкнулись с таким профилем:

Актор спал от момента t0 до 0.9s, затем с 0.9s до 1.3s обрабатывал сообщение, затем опять заснул до 2.3s, обрабатывал сообщение до 2.7s, спал до 2.9s, обрабатывал сообщение до 3.3s, затем заснул.

Приходит время сформировать статистику за первые 2 секунды, ситуация простая: для длинного и для короткого периодов статистика будет одинаковой. Всего два случая ожидания, суммарное время ожидания 1.6s, минимальное время ожидания на этом отрезке 0.7s (с момента времени 1.3s до 2.0s), максимальное время ожидания -- 0.9s (с момента t0 до 0.9s).

Гораздо интереснее на временной отсечке 4.0s. Со статистикой для длинного периода просто: всего четыре ожидания (0.0s-0.9s, 1.3s-2.3s, 2.7s-2.9s, 3.3s-4.0s), суммарное время ожидания 2.8s, минимум 0.2s, максимум 0.9s. А вот статистику за короткий период (т.е. за интервал 2.0s-4.0s) можно подсчитать двумя способами:

  1. Учитывать факт того, что ожидание началось в предыдущем коротком интервале, на точке 1.3s. В этом случае статистика будет такой: всего три ожидания (1.3s-2.3s, 2.7s-2.9s, 3.3s-4.0s), суммарное время ожидания 1.9s, минимальное 0.2s, максимальное 1.0s.
  2. Не учитывать факт начала ожидания в точке 1.3s, а вести отсчет только от точки 2.0s. В этом случае статистика будет такой: всего три ожидания (2.0s-2.3s, 2.7s-2.9s, 3.3s-4.0s), суммарное время ожидания 1.2s, минимальное время 0.2s, максимальное 0.7s.

Но еще серьезнее эти два подхода скажутся на статистике, которая будет формироваться в точке 6.0s. Для длинного периода опять все просто: всего пять ожиданий, суммарное время ожидания 4.8s, минимум 0.2s, максимум 2.7s. А вот по короткому периоду статистика будет такой:

  1. Если учитывать факт начала ожидания в точке 3.3s, то одно ожидание суммарной длительностью 2.7s, минимум и максимум по 2.7s;
  2. Если вести отсчет только от точки 4.0s, то одно ожидание суммарной длительностью 2.0s, минимум и максимум по 2.0s.

И вот вопрос, на который у меня нет ответа: какой из двух подходов к формированию статистики за короткий интервал считать правильным?

На мой взгляд, первый подход, когда мы учитываем факт начала ожидания в предыдущем периоде, более адекватный. Ведь, когда мы в точке 6.0s подводим итог наблюдений за последние 2 секунды, то у нас действительно всего один период ожидания, которое длится уже больше 2-х секунд. И то, что это единственное ожидание по времени больше, чем период наблюдения, для нас не суть важно.

С другой стороны, такие результаты могут быть обескураживающими для наблюдателя. Т.е. увидев, что на отрезке в 2 секунды актор провел в ожидании 2.7s невольно задаешься вопросом: а как такое вообще возможно? И нужно приложить некоторые усилия, чтобы понять что к чему.

Еще хуже первый подход для сценариев, когда мы пытаемся использовать статистику по коротким периодам для визуализации нагрузки на актора. Допустим, мы хотим рисовать график, на котором отображается процент загрузки актора. И обновляем этот график раз в две секунды. Если у нас суммарное время за короткий интервал может превышать длину интервала, рисование графика будет чуть сложнее. А вот во втором подходе, в котором такой ситуации быть не может, все гораздо проще. Плюс к тому, во втором подходе у нас появляется возможность просто суммировать показания статистики за короткие периоды и получать результаты, согласованные со статистикой по длинному периоду. Что так же упрощает обработку собираемой статистики.

Собственно, интересно мнение читателей -- а вы какой из подходов считаете правильным? Или может я вообще не прав, пытаясь считать статистику и по длинному, и по короткому периодам. И общепринятым считается какой-то другой способ?