Измерение интенсивности трафика при помощи u-моделей
Измерение интенсивности потоков в представлении художника.
В одной из наших предыдущих публикаций мы рассказывали о способе измерения интенсивности потока событий при помощи счетчика на основе экспоненциального распада. Оказывается, идея такого счетчика имеет интересное обобщение, о котором в этой публикации расскажут сотрудники компании Qrator Labs Артем Шворин и Дмитрий Камальдинов.
План погружения у нас следующий. Для начала рассмотрим и проанализируем несколько примеров того, как вообще считают события и оценивают интенсивность потока. Дальнейший шаг — увидеть обобщение, а именно — некоторый класс счетчиков, который мы называем u-моделью. После мы исследуем, какими полезными свойствами обладают u-модели, и предлагаем методику построения адекватной оценки интенсивности.
Без ограничения общности можно считать, что счетчик событий описывается своим состоянием , которое по приходе события в момент времени обновляется по некоторому правилу:
Состояние не обязательно выражается числом, но из соображений практической реализуемости можно считать, что оно представляется конечным набором битов.
В некоторых случаях события являются взвешенными, и при обновлении состояния требуется учитывать вес события :
Но для начала будем рассматривать простые невзвешенные события, а учет веса добавим потом, когда понадобится. Это будет совсем не сложно.
В этой статье мы ограничимся рассмотрением только детерминированных счетчиков, то есть таких, для которых правило обновления задается функцией . Но вообще в этот механизм бывает полезно добавить немного рандома, об этом мы недавно рассказывали [7] и, вероятно, продолжим еще.
Также должна быть возможность, зная состояние счетчика, оценить интенсивность потока. Вообще говоря, понятие интенсивности потока нетривиально, и позже мы его обсудим подробнее. Пока же будем просто считать, что к модели счетчика прилагается некоторая номинальная оценка в виде функции , выписанная из каких-то конструктивных соображений.
1.1 Линейные счетчики: подсчет всех событий
Самое простое, что можно придумать, — простой подсчет количества событий, произошедших с момента запуска. То есть по приходе события делаем вот так:
Будем называть такие счетчики линейными.
Оценка представляет собой среднюю интенсивность за всю историю:
Некоторую проблему может составлять то, что счетчик может переполниться. Также есть вопросы к тому, как задать оценку — очень старые события оказывают такое же влияние на оценку, как и недавние.
1.1.1 Подсчет событий в скользящем окне
Для устранения вышеописанных недостатков линейных счетчиков можно подсчитывать количество событий не с сотворения мира, а только тех, что произошли не более чем тактов назад. Этот временной интервал длины обычно называется окном, причем скользящим, поскольку с каждым тактом смещается вперед.
Наивная реализация предполагает запоминать все события в окне, что требует памяти. Однако есть способы сэкономить ресурсы в обмен на снижение точности, как это делают, например, здесь [6]. Правило обновления выражается довольно сложно, а в роли оценки будет средняя интенсивность за время :
К сожалению, и эта разновидность линейных счетчиков для наших целей не подходит: снижение точности еще можно потерпеть, а по памяти и по сложности выходит слишком накладно даже при небольших .
1.2 EDecay: экспоненциальный распад
Идея распадных счетчиков навеяна известной концепцией радиоактивного распада [4]. Ее суть состоит в том, что с течением времени количество нераспавшегося вещества уменьшается со временем по экспоненциальному закону:
где — количество вещества в начальный (нулевой) момент времени, — некоторый параметр, так называемая постоянная распада.
Удобней переписать это выражение в таком виде:
заменив параметр. Более подробно о параметризации моделей счетчиков см. раздел A приложения.
На основе этого механизма можно построить счетчик событий, как было описано в нашей статье [1].
Будем по определению считать, что каждому типу события соответствует величина , имеющая физический смысл «количества вещества» и зависящая от времени, которая при наступлении события скачком увеличивается на единицу, а в остальное время уменьшается по приведенному выше экспоненциальному закону.
То есть, чтобы учесть новое событие, пришедшее в момент времени , сначала нужно применить распад, а затем увеличить счетчик на единицу:
где — время прихода предыдущего события.
Чтобы этим можно было пользоваться, нужно придумать, как хранить счетчик в памяти. Самый простой способ представления состояния счетчика — пара чисел , где — время последнего обновления, а — количество вещества в этот момент. В этом случае правило обновления и оценку можно записать так:
В статье [1] мы детально разбираем такие счетчики. Важной идеей, которую здесь уместно упомянуть, является более экономичное предстваление состояние счетчика в виде одного числа , так называемого абсолютного значения, несущего в себе всю необходимую информацию для работы со счетчиком.
Величина не хранится явно в памяти, но может быть вычислена в любой момент. Хранится же значение , такое что в момент времени величина выражается следующим образом:
Не вдаваясь в подробности, скажем лишь, что при таком подходе правило обновления и оценка принимают вид:
1.3 QDecay: более быстрый распад
При рассмотрении модели экспоненциального распада можно заметить, что функция распада (в данном случае экспонента) удовлетворяет дифференциальному уравнению:
На самом деле, с физической точки зрения, скорее, наоборот — именно это уравнение описывает радиоактивный распад, а экспонента — его решение.
Действительно, смысл уравнения состоит в том, что скорость распада пропорциональна количеству имеющегося вещества. В какой-то момент нам захотелось, чтобы распад в модели происходил побыстрее, для этого мы попробовали взять не линейную, а квадратичную зависимость (quadratic decay, QDecay):
Решение — новая функция распада:
и она действительно стала покруче.
Аналогично рассмотренной ранее модели (с экспоненциальным распадом), здесь можно представить состояние счетчика в виде одного числа . Соответствующее правило обновления и оценка интенсивности выглядят так:
Здесь замечательно то, что вычисление функции обновления обходится дешево — оно требует только элементарных арифметических операций, причем деление только одно. То есть изначально мы хотели всего лишь более быструю лошадь (распад), а получили новое полезное качество (меньше вычислений).
Можно пойти дальше, взяв бо́льшую степень в уравнении на функцию распада: и так далее, но решение получается сложнее, вычисления дороже, а явной выгоды как-то не заметно. Не пригодилось.
1.4 SW: усреднение межпакетных интервалов
Рассмотрим еще один подход к построению счетчиков, а именно — усреднение. В данном случае будем усреднять интервал времени между соседними событиями. Мы называем эту величину межпакетным интервалом, поскольку имеем дело с сетевым трафиком, где в качестве события выступает приход сетевого пакета, а слово «межсобытийный» как-то не прижилось.
Вообще говоря, смысл этого подхода заключается в том, что у нас есть последовательность значений некоторой величины (в данном случае межпакетных интевалов), которая слишком быстро меняется, чтобы ее можно было использовать непосредственно, и хочется эту последовательность каким-то образом сгладить или усреднить.
Напомним, что чем новее события, тем интереснее нам их вклад в оценку интенсивности. Поэтому вместо обычного усреднения естественно использовать взвешенное, давая больший вес недавним событиям. Выбирать веса можно по-разному, сейчас попробуем взять веса в виде членов геометрической прогрессии. Такой способ суммирования называется экспоненциальным скользящим средним (EMA).
Применяя формулу экспоненциального усреднения к межпакетным интервалам, получим:
где — искомый EMA-усредненный межпакетный интервал, — момент наступления -го события.
Эта модель еще раз упоминается в разделе 4.3, где, в частности, показано, как выразить состояние счетчика одним числом и упростить вычисления. Пока же просто выпишем результат.
Обновление счетчика по приходе события в момент времени :
В качестве оценки интенсивности берется обратная величина усредненного значения межпакетного интервала:
1.5 Вероятностные счетчики
Идея вероятностных счетчиков — менять состояние счетчика по приходе события не всегда, а с некоторой вероятностью. Эту вероятность можно задавать по-разному, например
- держать ее постоянной (биномиальные счетчики);
- уменьшать в 2 раза после каждого успешного обновления (счетчики Морриса);
- менять после каждых событий. Очевидным же их недостатком является значительная ошибка при оценке числа событий. Мы подробно разбираем такие счетчики в статье [7], а также предлагаем некоторые расширения известных алгоритмов.
Если посмотреть на счетчики, основанные на идее распада, то можно заметить такую особенность: состояние описывается парой чисел , но потом чудесным образом удается выразить состояние одним числом . Попробуем найти общий принцип, по которому это становится возможно для любых счетчиков такого типа.Временно забудем тот факт, что на практике значение счетчика должно быть дискретно и описываться сравнительно небольшим количеством бит, и, оставаясь в рамках вакуумной сфероиппологии, положим, что и значение счетчика, и время прихода событий являются вещественными числами, а также преобразования над ними будут, соответственно, вещественнозначными. Потом (см. раздел 3.3) научимся дискретизировать модели, делая их пригодными на практике.
2.1 Инвариант распада
Рассмотрим участок кривой распада (см. рис. 1a). Пусть в момент времени было зарегистрировано событие, и потом на интервале других событий не было. Сейчас находимся в точке и собираемся учесть новое событие или хотя бы просто посмотреть, какова величина в этот момент, чтобы оценить интенсивность. Можно заметить, что с точки зрения наблюдателя, находящегося в моменте , нет совершенно никакой разницы, находится ли последнее событие на графике в точке или же в точке . Сей факт как бы намекает, что хранить два числа в качестве состояния — явно избыточно. Таким образом, два формально разных варианта реальности функционально эквиалентны, то есть дают один и тот же эффект:
Вообще говоря, у нас не одна распадная кривая, а целое семейство (см. рис. 1b). Каждая из этих кривых описывает одно и то же состояние. Их можно некоторым образом занумеровать, и в качестве состояния счетчика взять номер, точнее, индекс кривой.Посмотрим теперь, как должно происходит обновление такого счетчика. Пусть — текущее состояние счетчика. Согласно распадной модели, это значит, что при отсутствии событий значение с течением времени будет меняться, оставаясь на кривой . Пусть в некоторый момент времени происходит событие. Это значит, что величина скачком увеличивается на единицу (см. рис. 1c), то есть среди всего семейства кривых надо найти ту, которая проходит через точку , где . Пусть — индекс этой кривой, то есть
тогда именно это значение нужно записать в качестве нового состояния счетчика.ЗамечаниеЕсли нужно учитывать взвешенные события, то изменение происходит не на единицу, а на вес события: .Пока не очень понятно, как находить индекс нужной кривой, но совсем скоро это прояснится.
2.2 Трансляционная симметрия
На рис. 1b распадные кривые изображены так, что они отличаются друг от друга только сдвигом по горизонтали. По-научному это называется трансляционная симметрия времени [8]. Мы хотим взять это свойство в качестве аксиомы для нашей модели счетчика. Действительно, логично ожидать, что в рамках модели распад сегодня происходит в точности так же, как вчера.Математически это можно свойство записать так:
то есть кривая получается из кривой сдвигом вправо на некоторую величину .Вообще кривые можно занумеровать как попало, нужно лишь уметь находить индекс новой кривой при операции обновления. Но удобнее всё же нумеровать по порядку, так чтобы индекс представлял собой что-то осмысленное, а именно — вещественное число, соотвествующее расстоянию по горизонтали между данной кривой и кривой с нулевым индексом . Тогда, благодаря трансляционной симметрии, любая кривая из семейства очень просто выражается через кривую номер ноль:
ЗамечаниеЗдесь введено обозначение , которое удобно тем, что функция монотонно возрастает. Это потом пригодится в разделе 2.4 при определении интенсивности.Теперь правило обновления по приходе события в момент времени можно выразить из уравнения (5) следующим образом:
Таким образом, правило обновления представляется в виде
где — некоторая функция.Это правило выглядит настолько просто и универсально, что его можно взять в качестве определения. Именно так мы будем определять u-модель.
ЗамечаниеЕсли распадная функция задается дифференциальным уравнением вида
то для нее всегда легко находится инвариант, который обладает свойством (6).Действительно, решение дифференциального уравнения можно записать в виде
Тогда в качестве инварианта можно взять , а соответствующая кривая выражается как .В разделе 3.1 перечислены формальные свойства, которым должна удовлетворять функция , чтобы на ее основе построить работоспособную модель счетчика.
2.3 Абсолютное и относительное
Можно сказать, что — это абсолютное значение счетчика, оно хранится непосредственно в памяти, а — относительное значение счетчика в момент времени . Тогда получается, что функция обновления работает с относительным значением счетчика: .Тот факт, что функция обновления работает с относительным значением счетчика, отражает принцип распада: если события не происходят, то абсолютное значение не меняется, а относительное — автоматически убывает с течением времени. И оценка интенсивности, соответственно, тоже будет падать. С точки зрения вычислений очень удобно — пока событий нет, ничего делать не надо. Очень похоже на инфляцию в экономике: состояние счетчика — это банкноты, лежащие под подушкой, а оценка интенсивности — покупательная способность этих банкнот, которая сама собой деградирует.
2.4 Оценка интенсивности
Для распадной модели значение по построению является оценкой интенсивности (см. формулу (6)). Однако с таким определением возникают некоторые проблемы. Во-первых, если мы используем определение модели через функцию , построить функцию будет затруднительно (пришлось бы решать функциональное уравнение (7)). Во-вторых, было бы неплохо проверить экспериментально, насколько адекватно конкретный счетчик измеряет интенсивность.Сохраняя не букву (из формулы (6)), но дух идеи распда, будем строить оценку интенсивности как функцию от одного аргумента, а именно — от относительного значения счетчика: . Таким образом, задача ставится так: имея функцию обновления , построить фукнцию , которая была бы адекватной оценкой интенсивности.
Получается, что подход u-модели состоит в реализации следующего плана (да, выглядит несколько по-панковски).
- Берем какие-нибудь модели, построенные из «физических соображений», и для каждой из них выражаем правило обновления через u-функцию.
- Затем абстрагируемся от физического смысла, оставляя только голую u-функцию. Теперь можно, не заботясь о смысле, смело менять u-функцию, например, выбирая более вычислительно дешевую.
- Наконец, придумываем, как заново внести смысл — построить адекватную оценку интенсивности.
- PROFIT!
Для того, чтобы этот план стал возможным — загвоздка, очевидно, только в пункте 3, — потребуется наложить какие-то ограничения на u-функцию, и сейчас попробуем выяснить, какие именно. Эти мотивационные рассуждения, однако, можно пропустить и сразу перейти к определению ограничений (9) на u-функцию.
2.4.1 Равномерный поток
Наша компания занимаемся изучением трафика в сети, и мы можем считать приход сетевых пакетов штуками — это будет поток, интенсивность которого измеряется в пакетах в секунду (pps, packets per second). А можем учитывать размер пакетов, тогда размер выступает в качестве веса события, соответственно, интенсивность такого взвешенного потока будет измеряться в битах в секунду (bps, bits per second). Бывает также важным различать пакеты по их содержимому (IP-адреса источника и/или получателя, номера портов, протокол и т.п.), тогда мы группируем события по типам и для каждого типа заводим отдельные счетчики.Поскольку мы здесь занимаемся оценкой интенсивности потока событий, нужно вначале формализовать понятия события и потока событий.
Определение (событие). Событием назовем тройку , где — время прихода события, — тип события, некоторый идентификатор потока.
Определение (поток событий). Поток событий определяется как последовательность событий , . Причем события в потоке должны быть упорядочены по времени: при .
В большинстве реализаций систем учета событий время считается дискретной величиной: , однако для теоретических рассуждений бывает удобно обобщить и считать время непрерывным: .
Если нас интересуют только события как таковые, например, мы измеряем количество пакетов штуками в секунду, то вес можно полагать равным единице. Предполагается также, что отдельный счетчик учитывает события одного типа, то есть поле служит для различения разных потоков и не играет роли рамках одного счетика.
Определение (равномерный поток). Детерминированный равномерный поток определяется следующим образом:
где .Теперь можно выразить способ измерения интенсивности потока для любой модели. Пусть на счетчик набегает поток некоторой известной интенсивности , и мы наблюдаем, как меняется относительное значение счетчика — пусть после -го события измеренное значение счетчика равно .
Хочется, чтобы интенсивность потока и последовательность значений были как-то связаны между собой. Тогда, если повезет, мы могли бы построить функцию оценки интенсивности .
2.4.2 Аттрактор
Изучая на конкретных примерах поведение u-модели под воздействием детерминированного потока, мы обнаружили, что (по крайней мере для этих примеров) существует понятие аттрактора, который не вполне формально описывается следующими свойствами.Поскольку нам нужно по значению счетчика судить об интенсивности потока, требуется решить обратную задачу. Это возможно в силу монотонности и непрерывности — существуют функции , такие что при попадании в аттрактор, можно гарантировать, что истинное значение интенсивности лежит в интервале .
Разумеется, для того чтобы эти свойства были практически полезными, нужно, чтобы, во-первых, отрезок-аттрактор был коротким, иначе точность будет низкой, во-вторых, чтобы сходимость была быстрой, иначе придется долго ждать, прежде чем счетчик начнет показывать адекватное значение. В любом случае для конкретной u-модели можно записать решение в явном виде и оценить точность и скорость сходимости.
Теперь попробуем перейти от частного к общему. Зададимся вопросом: какие условия нужно наложить на u-функцию, чтобы у соответствующей u-модели появился аттрактор с указанными выше свойствами? Исчерпывающий ответ изложен в следующем разделе.
3.1 Определение u-модели
Пусть функция удовлетворяет следующим условиям:
\begin{gather}
u (x)\text{ возрастает},\tag{9a}\\
\Delta u (x) \ge 0\text{ при всех }x,\tag{9b}\\
\Delta u (x)\text{ убывает},\tag{9c}\\
\Delta u (+\infty)=0,\tag{9d}
\end{gather}
где .Определение (u-модель). Рассмотрим способ обновления счетчика, построенный на основе функции , обладающей свойствами (9), при котором обновление счетчика по приходе события в момент времени выражается правилом (8):
Такой способ обновления счетчика назовем u-моделью обновления.Функция , удовлетворяющая условиям (9), обладает некоторыми полезными свойствами. Например, функция (а также ) непрерывна. Это доказывается из свойств (9a) и (9c) с помощью --формализма.
3.2 Измерение интенсивности
Свойств (9) оказывается достаточно, чтобы обеспечить существование аттрактора и построить верхнюю и нижнюю оценки интенсивности. На этот счет есть несколько теорем, часть из которых представлена в этом разделе, а часть осталась за кадром.3.2.1 Строгая u-модель
Можно заметить, что условия (9) не запрещают случай, когда приращение функции обновления обращается в ноль в некоторой точке, то есть когда . В этом случае будет обращаться в ноль и при всех и применить к нему серию обновлений, то значения, бо́льшие чем , будут недостижимы — относительные значения счетчика никогда не выйдут за пределы . То есть можно назвать рабочим диапазоном u-модели. Вне этого диапазона u-функция устроена тривиально, и ее поведение нам не интересно. Эта оговорка нужна, чтобы ввести понятие строгой u-модели.Определение (строгая u-модель). Если в дополнение к свойствам (9) функции и являются строго монотонными на , то соответствующую u-модель обновления назовем строгой.
Теорема (теорема о неподвижной точке). Для строгой u-модели при воздействии детерминированного равномерного потока интенсивности последовательность значений является константной, если выполнено дополнительное условие: функция является сжимающим отображением, то есть , такое что .
Идея доказательства заключается в применении теоремы Банаха [5], которая гарантирует существование и единственность неподвижной точки у сжимающего отображения. Тогда все члены последовательности © Habrahabr.ru