Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass[bachelor, och, coursework, times]{SCWorks}
- % параметр - тип обучения - одно из значений:
- % spec - специальность
- % bachelor - бакалавриат (по умолчанию)
- % master - магистратура
- % параметр - форма обучения - одно из значений:
- % och - очное (по умолчанию)
- % zaoch - заочное
- % параметр - тип работы - одно из значений:
- % referat - реферат
- % coursework - курсовая работа (по умолчанию)
- % diploma - дипломная работа
- % pract - отчет по практике
- % pract - отчет о научно-исследовательской работе
- % autoref - автореферат выпускной работы
- % assignment - задание на выпускную квалификационную работу
- % review - отзыв руководителя
- % critique - рецензия на выпускную работу
- % параметр - включение шрифта
- % times - включение шрифта Times New Roman (если установлен)
- % по умолчанию выключен
- \usepackage[T2A]{fontenc}
- \usepackage[utf8]{inputenc}
- \usepackage{graphicx}
- \usepackage{subcaption}
- \usepackage{algorithm}
- \usepackage{algpseudocode}
- \usepackage[sort,compress]{cite}
- \usepackage{amsmath}
- \usepackage{amssymb}
- \usepackage{amsthm}
- \usepackage{fancyvrb}
- \usepackage{longtable}
- \usepackage{array}
- \usepackage{cellspace}
- \usepackage{booktabs}
- \usepackage{multirow}
- \usepackage{color}
- \usepackage[english,russian]{babel}
- \usepackage[pdfborder={0 0 0}]{hyperref}
- \newcommand{\eqdef}{\stackrel {\rm def}{=}}
- \newtheorem{lem}{Лемма}
- \newcommand{\tab}{\ \ \ \ \ \ \ \ \ }
- \renewcommand{\listalgorithmname}{Список алгоритмов}
- \floatname{algorithm}{Алгоритм}
- \newcommand{\hl}[1]{\textcolor{green}{#1}}
- \begin{document}
- % Кафедра (в родительном падеже)
- \chair{системного анализа и автоматического управления}
- % Тема работы
- \title{Моделирование служб очередей сообщений}
- %ВАРИАНТ ВАРИАНТ ВАРИАНТ ВАРИАНТ ВАРИАНТ
- % Курс
- \course{2}
- % Группа
- \group{281}
- % Факультет (в родительном падеже) (по умолчанию "факультета КНиИТ")
- %\department{факультета Компьютерный наук и информационных технологий}
- % Специальность/направление код - наименование
- \begin{center}
- \napravlenie{27.03.03 "-— Системный анализ и управление}
- \end{center}
- %\napravlenie{02.03.02 "-— Фундаментальная информатика и информационные технологии}
- %\napravlenie{02.03.01 "-— Математическое обеспечение и администрирование информационных систем}
- %\napravlenie{09.03.01 "-— Информатика и вычислительная техника}
- %\napravlenie{09.03.04 "-— Программная инженерия}
- %\napravlenie{10.05.01 "-— Компьютерная безопасность}
- %Для студентки. Для работы студента следующая команда не нужна.
- \studenttitle{cтудента}
- % Фамилия, имя, отчество в родительном падеже
- \author{Попова Данила Валерьевича}
- %ФИО ФИО ФИО ФИО ФИО
- % Заведующий кафедрой
- \chtitle{к.\,ф.-м.\,н.,\,доцент} % степень, звание
- \chname{И.\,Е.\,Тананко}
- %Научный руководитель (для реферата преподаватель проверяющий работу)
- \dolzh{доцент} %должность
- \satitle{доцент, к.\,ф.-м.\,н.\,} %степень, звание
- \saname{О.\,А.\,Осипов}
- % Руководитель практики от организации (только для практики,
- % для остальных типов работ не используется)
- %\patitle{к.\,ф.-м.\,н., доцент}
- %\paname{И.\,Е.\,Тананко}
- % Семестр (только для практики, для остальных
- % типов работ не используется)
- %\term{3}
- % Наименование практики (только для практики, для остальных
- % типов работ не используется)
- %\practtype{Учебная практика}
- % Год выполнения отчета
- \date{2020}
- \maketitle
- \tableofcontents
- \intro
- Очередь сообщений как сервис (Message Queuing as service~--- MaaS) стала популярной облачной\ службой и сегодня предлагается ведущими "облачными"\ поставщиками услуг. Microsoft Windows Azure Queue Service, StormMQ, IronMQ, RabbitMQ, Apache Kafka and ActiveMQ, HiveMQ, \newline CloudAMQP и другие \cite{1, 2, 4, 5, 6, 7, 8, 9}. MaaS можно использовать во многих облачных приложениях, таких как CRM, служба снабжения, веб-сервисы, колл-центры, биржевая торговля, логистические решения, системы инвентаризации, решения по управлению автопарком, и даже для агрегации, очереди и обработки данных Internet of Things (IoT), как в CloudMQTT\cite{10}. Обычно, эти "облачные"\ приложения имеют несколько частей или машин, участвующих в обработке требований, которые помещаются в централизованную очередь. Обслуживание поставленного в очередь требования обычно выполняется последовательно в несколько этапов, прежде чем оно выйдет из очереди.
- Учитывая ожидаемую интенсивность входящего потока, размер очереди и интенсивность обслуживания на каждом этапе работы приложения, модель может оценить производительность приложения с точки зрения общих параметров SLA, таких как пропускная способность, время отклика и вероятность потери запроса. Таким образом, инженеры могут настроить и скорректировать базовую конфигурацию приложения и размер очереди MaaS, чтобы немедленно удовлетворить данное SLA. Регулируемые параметры могут включать в себя размер очереди и интенсивность обслуживания запросов приложением. Согласование размера очереди может проводиться вручную или автоматически. Интенсивность обслуживания запросов может быть увеличена путем предоставления большего количества облачных вычислительных ресурсов.
- \newpage
- %==========================================================================================================
- \section{Обзор MaaS}
- ~\
- Abstract-MaaS это облачный сервис, который позволяет отделам разработки сосредоточиться на доставке бизнес-приложений и вычислительных приложений, не заботясь о базовой инфраструктуре очереди сообщений, согласованности, безопасности и надежности.
- Оценка задержки обслуживания (до предоставления облачных ресурсов) такого типа облачных приложений является важной инженерной проблемой и проблемой управления ресурсами. Такая оценка поможет вычислить общую задержку сети и сервиса, с которой сталкиваются пользователи. В каком-то смысле провайдеры облачных услуг выделяли бы соответствующие мощности для необходимых облачных ресурсов в соответствии с параметрами Соглашения об уровне сервиса (SLA). В данной работе рассматривается аналитическая модель с использованием цепи Маркова для изучения производительности облачных приложений, использующих MaaS. Учитывая ожидаемую интенсивность потока, размер очереди и ожидаемая интенсивность обслуживания на каждом этапе обработки облачного приложения, рассматриваемая аналитическая модель может оценить производительность приложения с точки зрения ключевые параметры SLA, которые включают время отклика, пропускную способность и потеря требований.
- \newpage
- %==========================================================================================================
- %==========================================================================================================
- \section{Модели теории массового обслуживания}
- Рассмотрим основные понятия теории массового обслуживания.
- Входящий поток --- это поток требований поступающих в систему и требующих обслуживания. Они возникают случайно и требуют определенного, обычно заранее точно предсказуемого времени для их выполнения.
- В простейшем случае входящий поток является пуассоновским: вероятность появления требования в любой сколь угодно малый промежуток времени пропорциональна длине этого промежутка и не зависит от того, возникали или нет требования в предшествующие промежутки времени. Пуассоновский поток обладает тремя свойствами: ординарностью, отсутствием последействия и стационарностью.
- \textit\textbf{Ординарность} --- вероятность появления за элементарный промежуток времени более одного требования сравним с нулем.
- \textit\textbf{Отсутствие последействия} --- вероятность появления $k$ событий на любом промежутке времени не зависит от того, появлялись или не появлялись события в моменты времени, предшествующие началу рассматриваемого промежутка.
- \textit\textbf{Стационарность} --- вероятность появления $k$ событий на любом промежутке времени зависит только от числа $k$ и от длительности $t$ промежутка и не зависит от начала его отсчёта
- Экспоненциальное распределение позволяет моделировать интервалы времени между наступлением событий. Говорят, что величина $\xi$ имеет экспоненциальное (показательное) распределение, если
- \begin{equation}
- P(\xi < x) =
- \begin{cases}
- 0,&\text{если $x<0$;}\\
- 1 - e^{-\lambda x},&\text{если $x \geq 0$;}\\
- \end{cases}
- \end{equation}
- Пусть $\xi$ – время ожидания события, тогда из формулы (1) следует, что вероятность того, что это событие наступит раньше $x$ равна $1 - e^{-\lambda x}$. Этот удобный формализм позволяет описывать моменты возникновения случайных событий.
- Нотация Кендала \textbf{A/B/m/n/k}.
- Системы, в которых в случайные моменты времени поступают требования, которые необходимо обслужить и имеются устройства для обслуживания этих требований, называются \textbf{системами массового обслуживания} (СМО). Для краткой характеристики СМО Д.Кендалл ввел символику \textbf{A/B/m/n/k}.
- \textbf{n} --- количество мест в очереди (емкость накопителя),
- \textbf{m} --- количество обслуживающих приборов,
- \textbf{k} --- количество источников.
- \textbf{A} и \textbf{B} характеризуют соответственно поток требований и процесс обслуживания, задавая функцию распределения интервалов между требованиями во входном потоке и функцию распределения времен обслуживания.
- \textbf{A} и \textbf{B} могут принимать значения:
- $D$ – детерминированное распределение,
- $M$ – показательное распределение,
- $\text{E}_r$ – распределение Эрланга порядка $r$,
- $\text{H}_r$ - гиперпоказательное распределение с $r$ этапами,
- $G$ – произвольный характер распределения.
- Цепи Маркова.
- Множество случайных величин ${X_n}$ образуют цепь Маркова, если вероятность того, что следующее значение (состояние) равно ${X_{n+1}}$, зависит только от текущего значения ${X_n}$ и не зависит от предыдущих значений процесса. Таким образом, имеется случайная последовательность, в которой воздействие всей предыстории процесса на его будущее полностью сосредоточенно в текущем значении процесса.
- Изменения состояний в цепи Маркова с дискретным временем могут происходить только в моменты, предопределяемые натуральным рядом чисел, а для
- цепи Маркова с непрерывным временем изменение состояния может произойти в любой момент времени, а значит появляется необходимость ввести
- в рассмотрение случайную величину, указывающую, как долго процесс остается в текущем(дискретном) состоянии перед тем, как перейдет в
- другое состояние. Однако, поскольку, согласно марковскому свойству, вся предыстория процесса полностью заключена в определении текущего состояния, нельзя требовать, чтобы описание этого текущего состояния содержало так де информацию о том, как долго процесс находится в этом состоянии.
- Это накладывает существенные ограничения на распределение времени пребывания процесса в данном состоянии. Время пребывания в этом состоянии
- должно быть распределено по показательному закону. Таким образом, показательное распределение является непрерывным распределением без последействия. Аналогично в случае цепи Маркова с дискретным временем время пребывания процесса в данном состоянии описывается геометрическим
- распределением, которое является единственным дискретным распределением без последействия. Требование отсутствия последействия накладывается на все цепи Маркова и является существенным ограничением общности тех процессов, которое будут рассмотрены\cite{Kleinrok}.
- \section{Аналитическая модель}
- На рисунке~\ref{fig2} показана упрощенная модель облачных приложений, использующих MaaS, в виде системы массового обслуживания(СМО). Как показано нарисунке~\ref{fig2}, требование сначала поступает в очередь вместимостью $K-1$, а затем обслуживается \textit{последовательно} на $N$ этапах. Длительность обслуживания требования на этапе $i$ имеет экспоненциальное распределение с параметром $\mu_i$, $i = 1,\dots , N$.
- Новое требование поступает на $1$\textit{-й этап} только после того, как предыдущее требование покинуло систему, т.е. покинул последний, $N$\textit{-й этап}. Выполнение всех этапов является взаимоисключающим. Это означает, что в любой момент времени обслуживается одно требование. Предполагается, что в систему поступает пуассоновский поток требований с интенсивностью~$\lambda$. Порядок обслуживания поступающих требований - Первый Пришел Первый Обслужен (FCFS - First Come First Served).
- \begin{figure}[!ht]
- \centering
- \includegraphics[width=0.9\linewidth]{fig2.pdf}
- \caption{\label{fig2}%
- Многофазная система массового обслуживания.
- }
- \end{figure}
- % процесс - поток
- \textbf{Обоснования адекватности модели}. В \cite{12} было показано, что под большой нагрузкой, что интенсивность прибытия HTTP-запросов следовать пуассоновскому процессу. Другие исследования показали, что процесс поступления других сетевых запросов (например, HTTP или XML)может не всегда является пуассоновским потоком, например имеет место групповое поступление\cite{13}. Кроме того, в реальности время обслуживания не всегда может быть распределено экспоненциально. Для тех предположений, которые связаны с быстрым трафиком и не Пуассоновским поступлением, аналитическое решение становится трудноразрешимым и трудно поддается моделированию. Тем не менее, в литературе широко использовалось моделирование очередей с предположениями о поступлении Пуассоновского потока требований и экспоненциальном времени обслуживания, которые обеспечили адекватное приближение реальных систем \cite{12, 13}.Результаты, полученные в результате анализа, хорошо согласуются с экспериментальными измерениями, полученными в результате генерации реалистичного HTTP-трафика. Наконец, рассматриваемая модель предполагает, что этапы приложения обрабатываются последовательно\cite{11}. Для этого случая рассматриваемая модель все еще полезна, рассматривая распараллеленные вычисления как один этап вычислений с некоторой приблизительной общей интенсивностью обслуживания~$\mu$. Однако, точность такого приближения при использовании параллельных вычислений является предметом дальнейших исследований.
- Поведение системы может быть описано цепью Маркова с непрерывным временем и бесконечным числом состояний $S$,
- \[
- S = \{ (k, n),\ 0 \leq k \leq K,\ 0 \leq n \leq N \},
- \]
- где $k$ обозначает число прибвающих в системе требований, а $n$ - активный этап обслуживания. Очередь системы имеет вместимость $K-1$. Другими словами, состояние $(0,0)$ представляет собой особый случай, когда система пуста или простаивает, т.е. состояние бездействия системы. Состояния $(k,n)$ представляют собой состояния, в которых требование обслуживается на этапе $n$ с $k$ требований в системе. На~\ref{fig3} приведена соответствующая диаграмма интенсинвостей перехода между состояниями.
- \begin{figure}[!ht]
- \centering
- \includegraphics[width=0.8\linewidth]{fig3.png}
- \caption{\label{fig3}%
- Диаграмма интенсивности перехода состояний с многоступенчатой службой}
- \end{figure}
- \newpage
- Пусть $p_{k,n}$ есть стационарная вероятность состояния~$(k, n)$. Система уравнений глобольного баланса может быть записана следующим образом:\newline
- состояние $(0, 0)$:
- \[
- 0 = -\lambda p_{0,0} + \mu_N p_{1,N} ,
- \]
- cостояние~($1, N$):
- \[
- 0 = - (\lambda + \mu _N)p_{1,N} + \mu _{N-1} p_{1,N-1},
- \]
- состояние~($1, n$):
- \[
- 0 = - (\lambda + \mu _n)p_{1,n} + \mu _{n-1} p_{1,n-1}, \quad 2 \leq n \leq N - 1,
- \]
- состояние~$(1, 1)$:
- \[
- 0 = - (\lambda + \mu _1)p_{1,1} + \lambda p_{0,0} + \mu _N p_{2,N},
- \]
- состояние~$(k, N)$:
- \[
- 0 = - (\lambda + \mu _N)p_{k,N} + \lambda p_{k-1,N} + \mu _{N-1} p_{k,N-1}, \quad 2 \leq k \leq K - 1,
- \]
- состояние~$(k, n)$:
- \[
- 0 = - (\lambda + \mu _n)p_{k,n} + \lambda p_{k-1,n} + \mu _{n-1} p_{k,n-1},
- \]
- \[
- 2 \leq k \leq K - 1 ; 2 \leq n \leq N - 1,
- \]
- состояние~$(k, 1)$:
- \[
- 0 = - (\lambda + \mu _1)p_{k,1} + \lambda p_{k-1,1} + \mu _{N} p_{k+1,N}, \quad 2 \leq k \leq K - 1,
- \]
- состояние~$(k, N)$:
- \[
- 0 = -\mu _N p_{K,N} + \lambda p_{K-1,N} + \mu _{N-1} p_{K,N-1},
- \]
- состояние~$(k, n)$:
- \[
- 0 = -\mu _n p_{K,n} + \lambda p_{K-1,n} + \mu _{n-1} p_{k,n-1}, \quad 2 \leq n \leq N - 1,
- \]
- состояние~$(K, 1)$:
- \[
- 0 = -\mu _1 p_{K,1} + \lambda p_{K-1,1}.
- \]
- Следовательно, стационарные вероятности состояния $p_{k,n}$ могут быть рекурсивно записаны в терминах $p_{0,0}$. А при использовании нормализации, $p_{0,0}$ может быть выражено как:
- \[
- p_0 = p_{0,0} = \frac{1}{1 + \sum\limits_{k=1}^K \sum\limits_{n=1}^N \frac{p_{k,n}}{p_{0,0}}}
- \]
- Тогда все остальные вероятности состояний $\left\{p_{k,n} \colon 1 \leq k \leq K, 1\leq n \leq N\right\}$ могут быть выражены в терминах $p_{0,0}$
- Алгоритм 1 показывает, как вычислить все вероятности состояний.
- \begin{algorithm}
- Входные данные: $\lambda, K, N, Vector\ \mu [1 \dots N]$
- Выходные данные: $p_0, Matrix\ P[1 \dots K, 1 \dots N]$
- \caption{Алгоритм 1}\label{alg}
- \begin{algorithmic}[1]
- \State $p_0 = 1;$
- \State $P[i,j] = 0;$
- \For {i = 1 to K}
- \For {for j = 1 to N}
- \State P[i, j] = 0;
- \EndFor
- \EndFor
- \State $P[1,N] = \lambda/\mu[N];$
- \State $P[1, N-1] = ((\lambda + \mu[N])/\mu[N-1])\times P[1,N];$
- \For {i = N - 1 \textbf{downto} 2}
- \State $P[1, i-1] = ((\lambda + \mu[i])/\mu[i-1])\times P[1,i];$
- \EndFor
- \State $P[2, N] = ((\lambda + \mu[1])/\mu[N])\times P[1,1] - \lambda/\mu[N];$
- \For {i = 2 to K-1}
- \State $P[i, N-1] = ((\lambda + \mu[N])/\mu[N-1]) \times P[i, N]$
- $\tab\tab -(\lambda/\mu[N-1])\times P[i-1, N];$
- \For{j = N - 1 \textbf{downto} 2}
- \State $P[i, j -1] = ((\lambda + \mu[j])/\mu[j-1])\times P[i,j] $
- $\tab\tab -(\lambda/\mu[j-1])\times P[i-1, j];$
- \EndFor
- \State $P[i+1, N] = ((\lambda + \mu[1])/\mu[N])\times P[i,1]$
- $\tab\tab -(\lambda/\mu[N])\times P[i-1, 1]$
- \EndFor
- \State $P[K, N-1] = (\mu[N]/\mu[N-1])\times P[K,N]$
- \tab\tab$-(\lambda/\mu[N-1]) \times P[K-1, N])$
- % \algstore{bkbreak}
- \end{algorithmic}
- \end{algorithm}
- \newpage
- % \algrestore{bkbreak}
- \begin{algorithm}
- \begin{algorithmic}[1]
- \For {i = N-1 \textbf{downto} 2}
- \State $P[K, i-1] = (\mu[i]/\mu[i-1])\times P[K, i] - (\lambda/\mu[i-1])\times P[K-1,i];$
- \EndFor
- \State $p_0 = 1/(p_0+sum(P));$
- \State $P = p_0 \times P; // p_0 \times \forall p \in P$
- \State $return\ p_0, P;$
- \end{algorithmic}
- \end{algorithm}
- Следовательно, можно определить показатели производительности системы. Во-первых, пропускная способность $\gamma$ может быть выражена как эффективная интенсивность поступления $\lambda'$ которая составляет $\lambda(1 - P_{loss})$. Тогда,
- \[
- \gamma = \lambda(1 - P_{loss}),
- \]
- где $P_{loss}$ --- вероятность потери.
- $P_{loss}$ может быть выражено как
- \[
- P_{loss} = p_k = 1 - \frac{1-p_0}{\rho} = \frac{p_0 + \rho - 1}{\rho},
- \]
- где $\rho = \lambda \bar{X}$ есть коэффициент использования. Также, $P_{loss}$ может быть записано как вероятность пребывания в состояниях $(K,\{1\dots N\})$
- \[
- P_{loss} = \sum\limits_{n=1}^N p_{K,n}.
- \]
- Также $\gamma$ может быть выражена как
- \[
- \gamma = \frac{1-p_0}{\bar{X}},
- \]
- где $\bar{X}$ --- математическое ожидание длительности обслуживания, которое может быть записано как
- \[
- \bar{X} = \sum\limits_{n=1}^N \frac{1}{\mu _n}.
- \]
- Математическое ожидание $E[K]$ числа требований в системе и математическое ожидание $E[K_q]$ числа требований в очереди имеет вид
- \[
- E[K] = \sum\limits_{k=1}^K\sum\limits_{n=1}^N kp_{k,n}.
- \]
- \[
- E[K_q] = \sum\limits_{k=1}^K \sum\limits_{n=1}^N (k-1)p_{k,n} = E[K] - (1-p_0).
- \]
- Где $1 - p_0$ определяет математическое ожидание числа требований находящихся на приборах. Используя закон Литтла, математическое ожидание длительности пребывания требований в системе, может быть записано как
- \[
- W = \frac{E[K]}{\gamma} = \frac{1}{\gamma}\sum\limits_{k=1}^K\sum\limits_{n=1}^N kp_{k,n}.
- \]
- Тогда для математического ожидания длительности пребывания в очереди справедливо
- \[
- W_q = \frac{E[K_q]}{\gamma} = W - \bar{X} = \frac{1}{\gamma}\sum\limits_{k=1}^K\sum\limits_{n=1}^N kp_{k,n} - \sum\limits_{n=1}^N \frac{1}{\mu _n}.
- \]
- Коэффициент использования системы можно записать следующим образом
- \[
- U = \gamma\bar{X}.
- \]
- %==========================================================================================================
- \section{Численный эксперимент}
- Для вычисления стационарных характеристик и наблюдения за поведением системы при различных начальных условиях была написана программа на ЯП C++. Листинг программы представлен в приложении \ref{code}. Графики приведены ниже.
- \begin{figure}[!ht]
- \centering
- \subcaptionbox{График зависимости $U$ от $\rho$}
- {\includegraphics{rhoU.pdf}}
- \subcaptionbox{График зависимости $\gamma$ от $\rho$}
- {\includegraphics{rhogamma.pdf}}
- \subcaptionbox{График зависимости $E[K]$ от $\rho$}
- {\includegraphics{rhoEk.pdf}}
- \subcaptionbox{График зависимости $E[K_q]$ от $\rho$}{
- \includegraphics{rhoEkq.pdf}}
- \end{figure}
- \begin{figure}[!ht]
- \centering
- \subcaptionbox{График зависимости $p_0$ от $\rho$}
- {\includegraphics{rhop0.pdf}}
- \subcaptionbox{График зависимости $p_K$ от $\rho$}
- {\includegraphics{rhopk.pdf}}
- \subcaptionbox{График зависимости $W$ от $\rho$}
- {\includegraphics{rhoW.pdf}}
- \subcaptionbox{График зависимости $W_q$ от $\rho$}
- {\includegraphics{rhoWq.pdf}}
- \subcaptionbox{График зависимости $U$ от $\lambda$}
- {\includegraphics{lambdaU.pdf}}
- \subcaptionbox{График зависимости $\gamma$ от $\lambda$}
- {\includegraphics{lambdagamma.pdf}}
- \end{figure}
- \begin{figure}[!ht]
- \centering
- \subcaptionbox{График зависимости $E[K]$ от $\lambda$}
- {\includegraphics{lambdaEk.pdf}}
- \subcaptionbox{График зависимости $E[K_q]$ от $\lambda$}{
- \includegraphics{lambdaEkq.pdf}}
- \subcaptionbox{График зависимости $p_0$ от $\lambda$}
- {\includegraphics{lambdap0.pdf}}
- \subcaptionbox{График зависимости $p_K$ от $\lambda$}
- {\includegraphics{lambdapk.pdf}}
- \subcaptionbox{График зависимости $W$ от $\lambda$}
- {\includegraphics{lambdaW.pdf}}
- \subcaptionbox{График зависимости $W_q$ от $\lambda$}
- {\includegraphics{lambdaWq.pdf}}
- \end{figure}
- \newpage
- \newpage
- %==========================================================================================================
- \newpage
- %==========================================================================================================
- \newpage
- %==========================================================================================================
- \conclusion
- MaaS используют большое количество компаний, которым необходимо следить за своим оборудованием и программным обеспечением постоянно или достаточно часто.
- MaaS легко можно модифицировать. Отчетность становится проще: MaaS дает отчет по работе всей инфраструктуры в целом, а не по отдельным ее разделам. Работа любого приложения или устройства может быть включена в отчет.
- В данной работе была рассмотрена аналитическая модель с использованием цепи Маркова для вычисления стационарных характеристик. Результаты совпали с численными результатами эксперимента, проделанным Халедом Салахом и Тарекой Рахилом Шелтамом в статье\cite{stat}.
- Таким образом, диспетчер очереди --— это архитектурный паттерн, приложение, которое принимает и отдает сообщения между отдельными модулями/приложениями внутри некоторой сложной системы, где модули/приложения должны общаться между собой --— то есть пересылать данные друг другу.
- \begin{thebibliography}{99}
- \bibitem{1} G.\,Mantri,\,Comparing Windows Azure Queue Service and Amazon Simple Queue Service [Электронный ресурс] : [сайт]. --- URL :
- http://gauravmantri.com/2012/03/27/comparing-windows-azure-queue-service-and-amazon-simple-queue-service/
- \bibitem{2}Amazon Inc., “Amazon Simple Queue Service,” [Электронный ресурс] : [сайт]. --- URL : http://aws.amazon.com/sqs/
- http://stormmq.com/cloud-based-mq-services
- \bibitem{4}Iron.io., IronMQ: Elastic and Scalable Message and Event Handling [Электронный ресурс] : [сайт]. --- URL : http://www.iron.io/products/mq
- \bibitem{5}RabbitMQ [Электронный ресурс] : [сайт]. --- URL : http://www.rabbitmq.com/
- \bibitem{6} Kuan-Ching,\,Li. Big Data Management and Processing / Li.\, Kuan-Ching, A.\,Y.\,Zomaya, H.\, Jiang. --- T.~: Chapman and Hall/CRC, 2017. --- 487 с.
- \bibitem{7}ActiveMQ [Электронный ресурс] : [сайт]. --- URL : http://activemq.apache.org/
- \bibitem{8}HiveMQ [Электронный ресурс] : [сайт]. --- URL : http://www.hivemq.com/
- \bibitem{9}CloudAMQP [Электронный ресурс] : [сайт]. --- URL : https://www.cloudamqp.com/
- \bibitem{10}CloudMQTT [Электронный ресурс] : [сайт]. --- URL : http://www.cloudmqtt.com/docs.html
- \bibitem{11} J.\,Dean,\,MapReduce: Simplified Data Processing on Large Clusters / J.\,Dean\, S.\,Ghemawat // Communications of ACM 2008. --- 113 c.
- \bibitem{12} M.\,Andersson,\,Web Server Traffic in Crisis Conditions / M.\,Andersson,\,A.\,Bengtsson,\,M.\,Host,\,C.\,Nyberg, // Proceedings of the 3rd Swedish National Computer Networking Workshop --- 2005.
- \bibitem{13} W.\,Leland,\,On the Self-Similar Nature of Ethernet Traffic / W.\,Leland,\,M.\,Taqqu,\,W.\,Willinger,\,D.\,Wilson, // IEEE/ACM Transaction on Networking --- 1994. --- 213c.
- \bibitem{Kleinrok} Клейнрок,\,Л. Теория массового обслуживания : Учебник / Л.\,Клейнрок. --- М. : Машиностроение, 1979. --- 432 с.
- \bibitem{stat} Khaled,\,S. Modeling of Message Queueing as a Service // Computer Engineering Department / S.\, Khaled, \,Tarek\,R.\,S. --- 2018. --- URL: researchgate.net/publication/329698311\_Modeling\_of\_Message\_Queueing
- \_as\_a\_Service\_MaaS
- \end{thebibliography}
- \appendix
- \section{Вычисление стационарных характеристик}
- \label{code}
- \begin{verbatim}
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <random>
- #include <string>
- using namespace std;
- void connectFilesToStandardInputOutputStreams()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- }
- random_device rnd;
- mt19937 mersenne(rnd());
- int randomSign()
- {
- return (mersenne() % 2 == 0 ? 1 : -1);
- }
- double generateSmallNumber(int N = 100)
- //функция возвращает случайное значение от [-9;9]/N
- //можно использовать для изменения начальных условий
- //и наблюдением за системой
- {
- double res = (mersenne() % 10) / (N);
- return res * randomSign();
- }
- struct systemDescription
- {
- int K;
- int N;
- systemDescription(int k, int n)
- {
- K = max(k, 3);
- N = max(n, 3);
- }
- };
- vector< vector< long double > > calcPij
- (double lambda, systemDescription par, vector<double> mu)
- {
- int N = par.N;
- int K = par.K;
- double p0 = 1;
- vector< vector< long double > > P
- (K + 1, vector<long double>(N + 1));
- for (int i = 1; i <= K; ++i)
- for (int j = 1; j <= N; ++j)
- P[i][j] = 0;
- P[1][N] = lambda / mu[N];
- P[1][N - 1] = ((lambda + mu[N]) / mu[N - 1])*P[1][N];
- for (int i = N - 1; i > 1; --i)
- P[1][i - 1] = (lambda + mu[i]) / mu[i - 1] * P[1][i];
- P[2][N] = (lambda + mu[1]) / mu[N] * P[1][1] - lambda / mu[N];
- for (int i = 2; i <= K - 1; ++i)
- {
- P[i][N - 1] = (lambda + mu[N]) / mu[N - 1] * P[i][N]
- - (lambda / mu[N - 1]) * P[i - 1][N];
- for (int j = N - 1; j >= 2; --j)
- P[i][j - 1] = (lambda + mu[j]) / mu[j - 1] * P[i][j]
- - (lambda / mu[j - 1]) * P[i - 1][j];
- P[i + 1][N] = (lambda + mu[1]) / mu[N] * P[i][1]
- - (lambda / mu[N]) * P[i - 1][1];
- }
- P[K][N - 1] = mu[N] / mu[N - 1] * P[K][N]
- - (lambda / mu[N - 1]) * P[K - 1][N];
- for (int i = N - 1; i >= 2; --i)
- {
- P[K][i - 1] = mu[i] / mu[i - 1] * P[K][i]
- - (lambda / mu[i - 1]) * P[K - 1][i];
- }
- long double sumP = 0;
- for (int i = 1; i <= K; ++i)
- for (int j = 1; j <= N; ++j)
- sumP += P[i][j];
- p0 = 1 / (p0 + sumP);
- for (int i = 1; i <= K; ++i)
- for (int j = 1; j <= N; ++j)
- P[i][j] *= p0;
- P[0][0] = p0;
- return P;
- }
- struct performanceMeasures
- {
- int cntLambda;
- double lambda;
- vector<double> mu;
- double p0;
- double X;
- double gamma;
- double p;
- double Ploss;
- double Ek;
- double Ekq;
- double W;
- double Wq;
- double U;
- performanceMeasures() {}
- performanceMeasures(int cntLambda, double lambda,
- vector<double> mu, double p0, double X,
- double gamma, double p, double Ploss, double Ek, double Ekq,
- double W, double Wq, double U) : cntLambda(cntLambda),
- lambda(lambda), mu(mu), p0(p0), X(X), gamma(gamma), p(p),
- Ploss(Ploss), Ek(Ek), Ekq(Ekq), W(W),
- Wq(Wq), U(U){}
- void Show()
- {
- string line = string(30, '-');
- line += "\n";
- cout << line;
- cout << "Test #" << cntLambda << endl;
- cout << line;
- cout << "lambda = " << lambda <<endl;
- cout << "mu [] = ";
- for (auto v : mu)
- cout << v << "\t";
- cout << line;
- cout << "U = " << U << endl;
- cout << "gamma = " << gamma << endl;
- cout << "p0 = " << p0 << endl;
- cout << "p = " << p << endl;
- cout << "E[K] = " << Ek << endl;
- cout << "E[Kq] = " << Ekq << endl;
- cout << "W = " << W << endl;
- cout << "Wq = " << Wq << endl;
- cout << "X = " << X << endl;
- cout << "\n====================================\n";
- }
- static void ShowInfoAboutSystem()
- {
- cout << "K - размер системы,\n";
- cout << "N - количество этапов в системе,\n";
- cout << "cntLambda - количество различных лямбда"
- << "(корень квадратный из количества экспериментов) ,\n";
- cout << "lambda[i] - интенсивность потока
- на iм эксперементе,\n";
- cout << "mu[i] - вектор интенсивности обслуживания на iм
- эксперементе,\n";
- cout << "lambdaMin - минимальное значение lambda,\n";
- cout << "deltaLambda - разница lambda между двумя
- последующими экспериментами,\n";
- cout << "coefficientMu - коэффициент роста
- интенсивности Mu,\n";
- cout << "gamma - пропускная способность,\n";
- cout << "Ploss - вероятность потери,\n";
- cout << "p - коэффициент использования,\n";
- cout << "X - м.о. длительности обслуживания,\n";
- cout << "Ek - м.о. числа требований в системе,\n";
- cout << "Ekq - м.о. числа требований в очереди,\n";
- cout << "W - м.о. длительности пребывания
- требований в системе,\n";
- cout << "Wq - м.о. длительности пребывания
- требований в очереди,\n";
- cout << "U - rоэффициент использования системы.";
- }
- };
- int main() {
- connectFilesToStandardInputOutputStreams();
- systemDescription par(8, 5);
- int cntLambda = 15;
- vector<double> lambda(cntLambda);
- vector<vector<double> > mu(cntLambda, vector<double>(par.N + 1));
- double lambdaMin = 0.0002;
- double deltaLambda = 0.019990;
- double coefficientMu = 1.1;
- for (int i = 0; i < cntLambda; ++i)
- {
- lambda[i] = (i == 0 ? lambdaMin : lambda[i - 1] + deltaLambda);
- for (int j = 0; j < par.N; ++j)
- mu[i][j + 1] = coefficientMu*(i + 1);
- }
- cout << setprecision(3);
- vector<performanceMeasures> result(cntLambda * cntLambda);
- int cnt = 0;
- for (int f = 0; f < cntLambda; f++)
- {
- for (int i = 0; i < cntLambda; ++i)
- {
- vector<double> Mu = mu[f];
- vector<vector<long double> > P
- = calcPij(lambda[i], par, mu[f]);
- double p0 = P[0][0];
- double SumPkN = 0;
- for (int k = 1; k <= par.K; ++k)
- SumPkN += P[k][par.N];
- double X = 0;
- for (int n = 1; n <= par.N; ++n)
- X += 1 / Mu[n];
- double gamma = (1. - p0) / X;
- double p = lambda[i] * X;
- double Ploss = (p0 + p - 1) / p;
- double SumPKn = 0;
- double Ek = 0;
- for (int k = 1; k <= par.K; ++k)
- for (int n = 1; n <= par.N; ++n)
- Ek += P[k][n] * k;
- double Ekq = Ek - (1 - p0);
- double W = Ek / gamma;
- double Wq = Ekq / gamma;
- double U = gamma * X;
- result[cnt++] = performanceMeasures(cnt, lambda[i], Mu,
- p0, X, gamma, p, Ploss, Ek, Ekq, W, Wq, U);
- }
- for (auto v : result)
- v.Show();
- performanceMeasures::ShowInfoAboutSystem();
- }
- return 0;
- }
- \end{verbatim}
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement