Эрланг
Эрланг (обозначение Эрл) — безразмерная единица интенсивности нагрузки (чаще всего телефонной нагрузки) или единица нагрузки, используемая для выражения величины нагрузки, требуемой для поддержания занятости одного устройства в течение определённого периода времени.
1 эрланг (1 Эрл) — соответствует непрерывному использованию одного голосового канала в течение 1 часа. То есть если абонент проговорил с другим абонентом в течение одного часа, то на телекоммуникационном оборудовании была создана нагрузка в один Эрланг.
Оценка телекоммуникационного трафика в эрлангах позволяет вычислить количество необходимых каналов в конкретной зоне (области, базовой станции).
Эрланг используется операторами связи для учёта пропускной способности при транзите трафика, так как телефонная нагрузка — это случайная величина, которая определяется количеством поступивших вызовов за единицу времени и временем обслуживания абонента. Интенсивность нагрузки является произведением матожидания числа вызовов за единицу времени на среднее время обслуживания вызова; эта интенсивность и измеряется в эрлангах.
Единица названа в честь датского математика и инженера Агнера Крарупа Эрланга, который предложил использовать математический анализ для учёта телефонной нагрузки. Агнер Эрланг проводил анализ работы местной телефонной станции одной деревни, жители которой пытались установить соединение с абонентами других населённых пунктов. В 1909 году им была опубликована работа «Теория вероятностей и телефонные разговоры», в результате чего метод и стал популярным.
Ссылки
- Все о теории Эрланга
- Калькуляторы Эрланга
Erlang. Что это, зачем, как и для кого.
Статья короткая, если понравиться, попробую осветить этот язык программирования подробнее.
Что
Erlang, это функциональный язык программирования с динамической типизацией, главной особенностью которого является программирование на уровне отдельных процессов(почти аналог threads в других ЯП), коммуникация между которыми реализуется с помощью MPI(Message Passing Interface).
Зачем
Рост частот центральных процессоров остановился. Растет количество ядер и количество узлов в кластерах. Erlang создан для максимального упрощения разработки программ которые могут использовать всю мощь многоядерных и/или много узловых систем.
Успешные примеры использования Erlanga — Jabber(ура!) сервер ejabberd, web-сервер YAWS и многочисленные эксперименты, например comet-программа(специфический стиль программирования веб-сайтов, когда сервер не разрывает подключения с клиентом, а продолжает пересылать ему данные при необходимости) способная держать 1,000,000(миллион) TCP-подключений.
Никаких сравнений я приводить не буду, достаточно сказать, что ети программы выдерживают бешеную нагрузку и очень сопротивляются попыткам их убить 🙂
Как
Программирование на уровне отдельных, изолированных процессов дает много преимуществ перед обычным стилем программирования параллельного ПО.
Начнем из истоков — почему трудно программировать такое ПО на жаве, си или шарпе? Проблема очень глобальная и существует во всех этих языках — общий доступ к памяти. Программируя на этих ЯП вы не можете быть уверены, что вместимое памяти, куда ссылаются ваши переменные не изменил какой-то другой поток(трэд, thread, нить. ). Из-за этого, очень часто приходиться прибегать к разнообразным, проверенным временем, трюкам — локи, мутексы, семафоры. И делать это трудно. Трудно не только начинающему программисту, но и программисту с опытом, от которого зависит работоспособность системы, если над ней работают еще несколько опытных/неопытных программистов.
Вообще говоря, в Erlang’е ета проблема не решена. Она просто изолирована на уровень ниже самого языка. Каждый процесс изолирован и не имеет доступа к памяти других процессов.
В двух словах: если нет общей памяти то нет проблемы с доступом к этой памяти.
Для кого
Erlang очень прост в изучении, в синтаксисе можно разобраться в течении дня-двух, в принципах программирования — неделя-другая. Но вот парадигма программирования достаточно сложна и переключиться на нее(особенно если есть огромный опыт в императивных ЯП) достаточно сложно и иногда совсем не хочется. Не раз слышал — как можно программировать не объектами? Весь мир состоит из объектов и взаимодействия между объектами! Ответ банальный — весь мир состоит из процессов и взаимодействия между процессами в той же мере в какой он состоит из объектов.
С использованием этого ЯП многие задачи решаються тривиально, и я считаю, что Erlang — лучший ЯП, с которого стоит начинать знакомство с функциональными языками. Особенно если программы должны быть параллелизированы и кластеризированы.
Планирование пропускной способности базовой радиостанции в соответствии с теорией Эрланга
Перед созданием, как классической телефонной сети, так и системы профессиональной радиосвязи необходимо оценить ее потенциальную загрузку в пересчете на условный канал связи. Разумное планирование сети позволит избежать таких неприятных ситуаций как блокирование каналов или незанятость ресурсов сети. Показателем неэффективных инвестиций является значительное простаивание ресурсов сети.
Между системами конвенциональной радиосвязи (без управляющего канала) с одним голосовым каналом и системами транкинговой радиосвязи, с независимым управляющим каналом, есть существенная разница. Именно посредством использования управляющего канала организуется очередь, контролируются приоритеты абонентов и длительность переговоров. Псевдотранкинговые системы профессиональной радиосвязи (например, Motorola MotoTRBO Capacity Plus ) без управляющего уступают системам транкинговой радиосвязи в меньшей степени. Таким решениям мы посвятим отдельную публикацию.
В транкинговых сетях радиосвязи инфраструктура сети позволяет создавать очередь из абонентов, а не отвергать запрос на соединение, как это делается в конвенциональных системах, сетях GSM или телефонной связи. Необходимый канал может освободиться через несколько секунд и целесообразно удержать вызов, чем отвергнуть его и заставить абонента повторно инициировать вызов.
В транкинговых сетях появляется дополнительный параметр — время ожидания свободного канала в очереди. В классических телефонных сетях такой параметр не применим, что вынуждает закладывать большее число каналов для уменьшения вероятности отказа в обслуживании.
Датчанин Агнер К. Эрланг (1878–1929) предложил алгоритм математического анализа телекоммуникационного трафика. На примере небольшой деревни он оценил ту часть абонентов местной телефонной станции, которая пытается установить соединение с абонентами за пределами деревни. В 1909 году он опубликовал работу «Теория вероятностей и Телефонные соединения» и в результате его формула была признана и принята Английским Почтамтом. Эрланг (1 Эрл) — единица измерения телекоммуникационного трафика, соответствующая непрерывному использованию одного голосового канала в течение определенного интервала времени (1 час). Понятно, что нас интересует структура голосовых вызовов в часы наибольшей нагрузки. Оценка телекоммуникационного трафика в Эрлангах позволяет вычислить количество необходимых каналов в конкретной зоне (области, базовой станции).
Используются две концепции Эрланга: Erlang B и Erlang C.
Erlang В. Эта концепция относится к классическим телефонным сетям и служит для предсказания вероятности блокирования вызова. Таким образом, можно с приемлемой вероятностью блокирования определить число требуемых разговорных каналов. Делаются следующие допущения:
- количество абонентов бесконечно велико;
- случайная длительность вызовов;
- интервалы между вызовами случайные;
- время установления соединения ничтожно мало;
- ресурсы предоставляются в соответствие с порядком поступления запроса;
- блокированные вызовы не рассматриваются.
Таким образом, вероятность блокировки вызова Pb вычисляется по формуле:
где:
C — число каналов трафика;
A — общая нагрузка (в Эрлангах).
Erlang С. Эта концепция предполагает, что вызовы в системе могут удерживаться до тех пор, пока не обслужатся. То есть может быть сформирована очередь удержанных вызовов, что реализовано во всех стандартах транкинговой связи.
Делаются следующие допущения:
- количество абонентов бесконечно велико;
- случайная длительность вызовов;
- интервалы между вызовами случайные;
- вызов, поступивший первым в очередь, покидает её первым;
- время установления соединения ничтожно мало;
- ресурсы предоставляются в соответствие с порядком поступления запроса.
В этом случае вероятность удержания вызова (вероятность, что вызов будет поставлен в очередь) Pd вычисляется по формуле:
А вероятность того, что удержанный вызов будет находиться в очереди более чем время , определяется выражением (2):
где:
H — среднее время удержания канала в пересчете на одного абонента.
A — полезная нагрузка, определяемая из выражения (3):
где, в свою очередь:
M — количество абонентов;
λ — количество вызовов на одного абонента в час наибольшей нагрузки (ЧНН).
Перемножением (1) и (2) можно определить вероятность того, что любой вызов будет задержан на время большее, чем t:
Эту величину принято называть качеством обслуживания. На рис. 1 приведен сравнительный анализ качества обслуживания для различных условий и числа каналов обслуживания. Полезная нагрузка на один канал приведена в Эрлангах.
Рис. 1. Качество обслуживания.
По стандарту TETRA ( ETSI ) на одной частотной несущей организуется 4 логических канала, причем один из них является управляющим, а остальные предназначены для передачи голоса или данных, формируя схему 1+3. В случае, если базовая станция содержит 2 несущих, реализуется схема 1+7 (1 управляющий и 7 разговорных). При расчетах нагрузки управляющий канал не учитывается. Стандарт DMR в конвенциональной реализации предусматривает 2 логических канала на одной частотной несущей в отличие от аналоговой конвенциональной радиосвязи с одним каналом, однако выбор разговорных каналов осуществляется абонентом вручную. Несколько лучше ситуация в системе конвенциональной радиосвязи Motorola MotoTRBO Capacity Plus где выбор разговорного канала осуществляется в циклическом порядке.
Один голосовой канал с эффективной сигналинговой системой (время коммутации вызова близко к нулю) выдерживает менее 0.375 Эрл нагрузки с качеством обслуживания 20%. То есть пользователи сети в час наибольшей нагрузки будут ожидать продолжительное время до тех пор, пока получат доступ к ресурсам. Для сравнения, пропускная способность одного канала в семиканальной транкинговой системе (например, система стандарта TETRA на две частотных несущих TetraFlex производства DAMM Cellular Systems A/S) увеличится при таком же качестве обслуживания до 0.85 Эрл, то есть в 2.26 раза.
Если же требования к качеству обслуживания возрастают до 5%, то преимущества семиканальной системы TETRA по отношению к одноканальной конвенциональной системе (в пересчете на один канал) будут более существенны. Можно видеть, что пропускная способность одного канала увеличится в шесть раз с 0,125 Эрл до 0,74 Эрл.
С ростом числа разговорных каналов преимущества еще более заметны.
Приведем расчет числа абонентов в системы транкинговой радиосвязи с одним управляющим каналом и тремя разговорными (система DAMM TetraFlex на одну несущую), со следующими допущениями:
— среднее время удержания канала (продолжительность вызова) в пересчете на одного абонента H = 20 с;
— количество вызовов на одного абонента в ЧНН λ = 5,
— количество каналов C = 3.
В этом случае полезная нагрузка на один канал составит 0,65 Эрл при качестве обслуживания 15%. Количество абонентов составит M = 23 на один канал (70 на всю сеть).
Другая полезная величина — среднее время удержания задержанных вызовов, Wd:
Среднее время ожидания для всех вызовов:
На рис. 2 приведены зависимости Среднего времени удержания вызова в очереди в час наибольшей нагрузки от полезной нагрузки (в пересчете на один канал) при условии, что качество обслуживания составляет 30%, среднее время удержания канала 20 сек.
Рис. 2. Оценка среднего времени удержания задержанных вызовов в очереди в ЧНН при качестве обслуживания 30%.
Среднее время нахождения в очереди при Полезной нагрузке на один канал в 0,6 Эрл при качестве обслуживания 30% уменьшится с 15 секунд для одноканальной аналоговой конвенциональной системы до 3 секунд для цифровой системы TetraFlex на три голосовых канала и до одной секунды для семиканальной системы TETRA.
Знакомьтесь, Erlang. Основы языка программирования
Erlang также используется и в проектах с открытым исходным кодом, например:
- Ejabberd, сервис мгновенных сообщений, использующий XMPP-протокол, написан на Erlang.
- Erlang использовался для создания базы данных хранения документов CouchDB.
Перед началом изучения Erlang стоит убедиться, что он установлен в вашей операционной системе. Попробуйте набрать в командной строке команду erl:
Eshell V5.7.2 (abort with ^G)
Для Windows вызов erl из командной строки работает только, если в переменную среды PATH добавлен путь к программе. В случае стандартной установки для Windows интерпретатор команд Erlang можно запустить через меню Start -> All Programs -> Erlang OTP. Если Erlang установлен в вашей системе, то вы увидите приветствие, похожее на пример выше. В случае если при вызове erl вы получили сообщение о неизвестной команде, вам нужно установить Erlang. Для большинства систем Erlang может быть установлен с использованием стандартной системы управления пакетами. Для Windows инсталлятор может быть скачан с официального сайта: http://erlang.org/download.html. В других системах можно собрать Erlang с использованием исходного кода, который также можно скачать с официального сайта: http://erlang.org/download.html.
Командная оболочка Erlang может использоваться для интерактивных сессий и выполнения выражений языка. Запустим оболочку командой erl (или через меню Windows, как описано выше) и наберем несколько команд:
1> % Это просто комментарий
Рассмотрим нашу первую сессию подробнее:
- При старте командой erl оболочка выводит заголовок с информацией о версии и опциях, с которыми собран Erlang.
- После этого выводится приглашение для ввода команд 1>. После первого приглашения мы набрали комментарий. Комментарии в Erlang начинаются со знака «%» и продолжаются до конца строки. Оболочка игнорирует комментарии.
- Затем оболочка опять выводит «1>», так как мы не набрали законченной команды. Теперь мы набираем «2 + 2», затем точку и нажимаем . Многие начинающие изучать Erlang забывают набрать точку в конце выражения, но в этом случае оболочка не сможет определить, что выражение закончено, и результат не будет выведен.
- Теперь оболочка вычисляет выражение и выводит результат (4, в нашем случае).
- После этого оболочка выводит приглашение в виде «2>». Где 2 – это номер команды, который увеличивается с каждой выполненной командой.
Оболочка является мощным инструментом при работе с Erlang. Кроме ввода выражений поддерживается история команд (например, комбинации клавиш + и + используются для передвижения по введенным прежде командам), различные возможности редактирования команд и множество вспомогательных функций, которые можно посмотреть командой help(). Кроме этого, оболочка позволяет присоединяться к запущенным программам Erlang даже на удаленных узлах (при этом также имеется возможность автоматического использования защищенного соединения через SSH) и многое другое. Надо заметить, что оболочка позволяет выполнять только выражения Erlang, но ее нельзя использовать для ввода других конструкций языка, которые мы будем рассматривать ниже.
Для выхода из оболочки можно использовать встроенную функцию halt():
В случае если оболочка не отвечает (или как другой способ нормального выхода), то можно прервать выполнение нажатием клавиш + (или + на Windows), после чего на экран будет выведено:
И теперь для прерывания выполнения можно нажать клавишу .
После того как мы научились работать в оболочке Erlang, рассмотрим основные конструкции языка.
Как и во многих языках, арифметические выражения Erlang следуют обычным правилам для арифметических выражений, например, «1 + 2 * 3» будет вычислено как 1+(2*3). Целые числа могут иметь произвольный размер, и нет необходимости беспокоиться об арифметических переполнениях.
Проверим это на практике:
1> 123456789 * 123456789 * 123456789 * 123456789.
232305722798259244150093798251441 |
Кроме этого, целые можно вводить в различных системах счисления, используя следующую форму:
Здесь мы ввели число 10 в десятичной, шестнадцатеричной и двоичной системах.
Для ввода кодов символов можно использовать нотацию, начинающуюся с символа $:
Числа с плавающей точкой можно вводить в следующих форматах:
Для чисел с плавающей точкой Erlang использует 64-битное представление, соответствующее стандарту IEEE 754-1985.
Переменные и сравнение с шаблоном
Имена переменных в Erlang должны начинаться с большой буквы, как в следующем примере:
232305722798259244150093798251441 |
В первой строке мы присваиваем значение числа 123456789 переменной X, и затем значение выводится оболочкой.
После этого мы выводим значение переменной и используем ее в арифметической операции.
Но при этом значение переменной Erlang может быть присвоено только один раз. Продолжая следующий пример, мы увидим следующее:
** exception error: no match of right hand side value 10 |
Что здесь происходит? Строго говоря, оператор «=» в Erlang не является оператором присваивания, а является оператором сравнения с шаблоном. При этом, если переменной в текущей области видимости еще не присвоено значение, «=» действует как оператор присваивания, в противном случае = сравнивает значение с шаблоном.
При сравнении с шаблоном сначала вычисляется правая часть выражения, затем она сравнивается с шаблоном в левой части. В последнем примере переменная X является простейшей формой шаблона. В данном случае сравнение с шаблоном будет успешным только в случае, если значение правой части выражения равно 123456789:
6> X = 100000000 + 23456789.
Одноразовое присваивание избавляет разработчика от огромного класса ошибок, связанных с неверным значением переменной, которая в противном случае могла бы быть изменена где-то между первым присваиванием и выражением, в котором она используется. Плюс к этому такое поведение согласовывается с математической нотацией, где невозможна формула вида X=X+1.
В Erlang атомы используются для представления глобальных нечисловых констант. При сравнении с другими языками можно представить атомы как элементы в перечисляемом типе данных. Значением атома является сам атом, и единственная операция над атомами – это сравнение.
Атомы должны начинаться с маленькой буквы (как мы уже рассмотрели выше, переменные должны начинаться с большой буквы, так что они не пересекаются с атомами), за которой могут следовать буквы, цифры, «@» и «_» (точка тоже может использоваться в атомах, хотя это является не поддерживаемым разработчиками расширением языка). При использовании одинарных кавычек (‘) для атома могут использоваться любые символы.
‘Hello, World!’ |