ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а так же учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).

Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) - географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам так же задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.

Выбор медиаресурса

  1. Выбор осуществляется среди зарегистрированных и активированных медиаресурсов.
  2. При выборе подходящего медиаресурса учитывается Zone(NID) и site.
  3. Сначала список доступных медиаресурсов фильтруется на основании параметра Zone(NID), затем выбирается ресурс с максимальным тяготением к site ресурса (минимальное "расстояние").
  4. При выборе медиаресурса для терминирующей стороны предпочтение отдается выделению точки "приземления" медиатрафика на том же медиасервере, который использовался для "приземления" медиатрафика вызывающей стороны. Если использование медиасервера вызывающей стороны невозможно (в силу отличных Zone(NID) вызывающего или вызываемого абонента), то медиаресурс терминирующей стороны выбирается по тому же алгоритму, что и для вызывающей стороны (с учетом Zone(NID) и site терминирующей стороны). Кроме того учитывается возможность проброса медиабриджа между медиасерверами вызывающей и вызываемой стороны.

Матрица связности

Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.

Пример
Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова.
Значения показывающие "расстояние" между сайтами являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента.
Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того, чтобы можно было на время вывести MSR из работы, например, для обновления. 
Если установлено расстояние между сайтами 0 - это означает, что медиаресурсы сайтов равноправны.
Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то необходимо установить расстояние между этими сайтами равное бесконечности - infinity.

Алгоритм определения ресурсов

Алгорим который использует ядро для поиска подходящего MSR эквивалентен следующему:

  1. Для заданного UA пользователя (далее просто UA), который будет парковаться на MSR определяются связанные с ним параметры Zone, Site, и опционально msr_id (если информация о нем присутствует);
  2. Для ядра, на котором обслуживается текущий коллпроцесс выполняется поиск зарегистрированных(поле Status = registered), административно разрешенных(поле Active = true)Ч, c зоной(Zone) UA контактов MSR;
  3. Из найденных контактов выбираются те, которые соответствуют известному msr_id (если он все таки задан, в противном случае подходят все контакты предыдущего шага);
  4. Далее выбранные контакты ранжируются по расстоянию между site UA и site самого контакта в соответствии с матрицей связанности:

    admin@[restfs1@IBM]:/$ system/media/site/matrix 
    ┌───────────┬───┬────┬────┬────┬───┐
    │ Site-name │ # │ 1  │ 2  │ 3  │ 4 │
    ├───────────┼───┼────┼────┼────┼───┤
    │ local     │ 1 │  0 │ 10 │ 20 │   │
    │ site_102  │ 2 │ 10 │    │    │   │
    │ site_103  │ 3 │ 20 │    │    │   │
    │ site_104  │ 4 │    │    │    │ 0 │
    └───────────┴───┴────┴────┴────┴───┘
    
    Legend:
     empty distance - infinity distance between sites.
    
    [exec at: 02.08.2017 12:19:55, exec time: 19ms, nodes: core2@IBM]

    Выбираются контакты с наименьшим расстоянием;

  5. Контакты, полученные на предыдущем шаге, сортируем с удалением дубликатов по имени msr (поле msr_name). Получаем контакты с уникальными msr-ами. Контакты содержат информацию о загруженности msr-а и коэффициенте производительности msr-а;
  6. На основе контактов, полученных на предыдущем шаге, строится интервальная таблица загруженности msr с учетом коэффициента производительности:
    1. Верхняя граница таблицы (table_upper_bound) выставляется в 0, помещаем все контакты в очередь;
    2. Если очередь не пуста, то забираем контакт из очереди:
      • Для контакта выставляем нижнюю границу(con_bottom_bound) по формуле:

        con_bottom_bound = table_upper_bound
      • Для контакта формируем верхнюю границу(con_upper_bound) по формуле:

        (100 - con_msr_load) * con_msr_performance_coefficient
      • Выставляем верхнюю границу таблицы(table_upper_bound) по формуле:

        table_upper_bound = table_upper_bound + con_upper_bound
      • Кладем контакт в список;
      • Переход к пункту 6.2;
    3. Если контактов в списке нет, то такое плечо UA релизится с соответствующим cause(msr не найден);
    4. Генерируем случайное число от 0 до table_upper_bound;
    5. В списке находим контакт, в границы которого попадает сгенерированное число. Найденный контакт используется для парковки данного UA на MSR.

Пример с 5 шага:

Шаг 5:
  Есть контакты con_1@msr_1, con_2@msr_1, con_1@msr_2, con_1@msr_3.
Шаг 6:
  Есть контакты con_1@msr_1, con_1@msr_2, con_1@msr_3.
  msr_1 загружен на 55%, коэф. производительности 1.0.
  msr_2 загружен на 40%, коэф. производительности 0.9.
  msr_3 загружен на 60%, коэф. производительности 1.2.

Шаг 6.1
  table_upper_bound = 0,
  queue = [con_1@msr_1, con_1@msr_2, con_1@msr3]

Шаг 6.2
  take from queue = con_1@msr_1

Шаг 6.2.1
  con_bottom_bound = 0

Шаг 6.2.2
  con_upper_bound = (100 - 55) * 1.0 = 45

Шаг 6.2.3
  table_upper_bound = 0 + 45 = 45

Шаг 6.2.4
   put to list = con_1@msr_1(0-45)

Шаг 6.3
   переход на шаг 4.2

Шаг 6.2
  take from queue = con_1@msr_2

Шаг 6.2.1
  con_bottom_bound = 45

Шаг 6.2.2
  con_upper_bound = (100 - 40) * 0.9 = 56

Шаг 6.2.3
  table_upper_bound = 45 + 56 = 101

Шаг 6.2.4
   put to list = con_1@msr_2(45-101)

Шаг 6.2
  take from queue = con_1@msr_3

Шаг 6.3
   переход на шаг 6.2

Шаг 6.2.1
  con_bottom_bound = 101

Шаг 6.2.2
  con_upper_bound = (100 - 60) * 1.2 = 48

Шаг 6.2.3
  table_upper_bound = 101 + 48 = 149

Шаг 6.2.4
   put to list = con_1@msr_3(101-149)

Шаг 6.4
   list = [con_1@msr_1(0-45), con_1@msr_2(45-101), con_1@msr_3(101-149)]
   generate 58

Шаг 6.5
   found con_1@msr_2(45-101)

Найден контакт con_1@msr_2 (msr c именем msr_2).

Пример настройки и парковки вызова

MSR регистрируют контакты со следующими параметрами:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr1_eth1mtsr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr2_eth1mtsr_sovetsky2
msr3_eth0rtkr_kirovsky3
msr3_eth1mtsr_kirovsky3

Имеющаяся следующую матрицу связности:

Site-named123456
r_kalininsky10




r_sovetsky2
0



r_kirovsky3

0


okrujnaya41320

molodeji5312
0
titova6221

0

Абонент UA1 хочет установить разговор с абонентом UA2, при этом они имеют следующие параметры:

UAzonesite
ua1rtkokrujnaya
ua2mtsmolodeji

Сначала паркуется плечо UA1.
Из списка активных контактов MSR выбираем все, которые принадлежат зоне rtk:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr3_eth0rtkr_kirovsky3

Список контактов остается прежним.
Вычисляем расстояние между ua site: okrujnaya и сайтом каждого из контактов. Имеем:

distancenamezonesitemsr_id
1msr1_eth0rtkr_kalininsky1
2msr3_eth0rtkr_kirovsky3
3msr2_eth0rtkr_sovetsky2

Контакты ранжированы в порядке увеличения дистанции. Берем первый из них и используем его для парковки UA1:
name: msr1_eth0, msr_id:1

Парковка второго плеча: ua2.
Он принадлежит другой зоне, поэтому список контактов после выбора по зоне будет выглядеть так:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1
msr2_eth1mtsr_sovetsky2
msr3_eth1mtsr_kirovsky3

На предыдущем шаге у нас определен msr_id=1.

С учетом msr_id получаем новый список контактов:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1

Далее вычисляем расстояние между ua2 site: molodeju и r_kalininsky.

distancenamezonesitemsr_id
1msr1_eth1mtsr_kalininsky1

В текущем примере используется довольно простая схема с MSR, поэтому для представленных условий у нас остался лишь один контакт.
Его и используем для парковки ua2.

Так как оба плеча сумели запарковаться на MSR, абоненты смогут обмениваться rtp трафиком.

Данный пример довольно простой и не иллюстрирует все способы применения заложенных возможностей и функций.
Однако базовые принципы показаны верно и их дальнейшая модификация позволит выстраивать весьма сложные схемы с территориальным тяготением голосового трафика.

Управление географическими зонами обслуживания медиасервера

declare

Команда предназначена для создания новой географической зоны (нового сайта), которую будет обслуживать медиасервер.

Имя сайта в системе должно быть уникальным. Если будет попытка создания сайта с уже используемым именем, команда вернет ошибку.

Путь команды:

/system/media/site/declare

Синтаксис:

declare <site name>

Параметры:

<site name> - имя сайта.

Пример:

admin@[mycelium1@ecss1]:/$ system/media/site/declare remote_side              
Site: remote_side.
 Created successfully.

[exec at: 17.02.2019 13:15:40, exec time: 447ms, nodes: core1@ecss2]

distance

Команда предназначена для установки "расстояния" между сайтами.

По умолчанию, когда создаются сайты связность между ними задается как бесконечность (infinity).

Для установки требуемого расстояния между сайтами необходимо выполнить команду:

Путь команды:

/system/media/site/distance

Синтаксис:

distance <site name> <site name> <distance>

Параметры:

<site name> - географическая зона;
<distance> - положение сайтов относительно друг друга.

Пример:

admin@[mycelium1@ecss1]:/$ system/media/site/distance remote_1 local 64           
Distance between remote_1 and local changed to: 64.

[exec at: 17.02.2019 13:23:59, exec time: 125ms, nodes: core1@ecss1]

list

Команда возвращает список географических зон (сайтов), обслуживаемых медиасерверами.

По умолчанию в системе существует неудаляемый сайт "local"

Путь команды:

/system/media/site/list

Синтаксис:

list

Параметры:

Команда не содержит аргументов.

Пример:

admin@[mycelium1@ecss1]:/$ system/media/site/list         
List of all sites:
 local
 remote
 remote_1
 remote_side

[exec at: 17.02.2019 13:26:10, exec time: 117ms, nodes: core1@ecss2]

matrix

Команда позволяет просмотреть матрицу географических зон (сайтов), которые обслуживает медиасервер.

Для просмотра всей матрицы выполняем команду без параметров. При этом будет отображены все сайты если их число не превышает 20, если их число больше, то отображаются первые 20 (сортировка по алфавиту).

Путь команды:

/system/media/site/matrix

Синтаксис:

matrix [<site name> [<site name>]]

Параметры:

<site name> - имя сайта.

Пример:

admin@[mycelium1@ecss1]:/$ system/media/site/matrix local remote remote_1     
┌─────────────┬───┬────┬───┬────┐
│  Site-name  │ # │ 1  │ 2 │ 3  │
├─────────────┼───┼────┼───┼────┤
│ local       │ 1 │  0 │   │ 32 │
│ remote      │ 2 │    │ 0 │    │
│ remote_1    │ 3 │ 32 │   │  0 │
│ remote_side │ 4 │    │   │    │
└─────────────┴───┴────┴───┴────┘

Legend:
 empty distance - infinity distance between sites.

[exec at: 17.02.2019 13:28:56, exec time: 85ms, nodes: core1@ecss2]

remove

Команда позволяет удалить сайт, обслуживаемый медиасервером, и всю информацию о нем.

Путь команды:

/system/media/site/remove

Синтаксис:

remove <site name>

Параметры:

<site name> - имя сайта.

Пример:

admin@[mycelium1@ecss1]:/$ system/media/site/remove remote_1              
Site: remote_1.
 Removed successfully.

[exec at: 17.02.2019 13:30:17, exec time: 100ms, nodes: core1@ecss1]

Коэффициент производительности

Для каждого медиасервера в системе можно установить  нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям.  Коэффициент(любое положительное целое или дробное число) устанавливается командой system/media/msr/set.

Примеры:

Установить для msr_1 коэффициент производительности 2

system/media/msr/set msr_1 performance_coefficient 2
 msr   msr_1
 set   performance_coefficient
 from  1.0
 to    2

[exec at: 21.07.2019 21:37:08, exec time: 102ms, nodes: core1@ecss1]

Просмотр:

admin@mycelium1@ecss1:/$ system/media/msr/list                                            
 Auto declared media server list specific:
┌───────┬─────────────┐
│ Name  │ Performance │
│       │ coefficient │
├───────┼─────────────┤
│ msr_1 │         2.0 │
│ msr_2 │         1.0 │
└───────┴─────────────┘

[exec at: 21.07.2019 21:37:12, exec time: 11ms, nodes: core1@ecss1]

Также данные значения можно увидеть при выводе списка медиаресурсов:

admin@mycelium1@ecss1:/$ system/media/resource/list active       
  Active media resource selected list specific:
┌─────────────┬───────┬────────────┬───────────┬──────┬────────┬───────────┬────────────┬───────────────────┬─────────┬──────────────┬────────┬─────────┬───────┬───────────────┬────────────┬─────────┐
│    Node     │  MSR  │    MSR     │    MSR    │ MSR  │ Cc-id  │ Cc-status │ Cc-uptime  │    Cc-address     │  Iface  │    Iface     │ Active │  Zone   │ Site  │    Contact    │   Status   │ Expired │
│             │       │  version   │ perf coef │ load │        │           │            │                   │  name   │     addr     │        │         │       │               │            │         │
├─────────────┼───────┼────────────┼───────────┼──────┼────────┼───────────┼────────────┼───────────────────┼─────────┼──────────────┼────────┼─────────┼───────┼───────────────┼────────────┼─────────┤
│ core1@ecss1 │ msr_1 │ 3.14.0.156 │       2.0 │    0 │ 22abcd │ connected │ 1 12:01:16 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true   │ default │ local │ bond1.2@msr_1 │ registered │      58 │
│             │ msr_2 │ 3.14.0.156 │       1.0 │    0 │ c5b9d8 │ connected │ 12:01:10   │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true   │ default │ local │ bond1.2@msr_2 │ registered │      57 │
└─────────────┴───────┴────────────┴───────────┴──────┴────────┴───────────┴────────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘

[exec at: 21.07.2019 21:51:27, exec time: 13ms, nodes: core1@ecss1]

Уровень загрузки медиасервера

Механизм информирования ядра о степени загруженности MSR реализован через подписки. Команды по управлению такими подписками приведены справочнике команд CLI - /system/media/msr/subscription/.

Подписка MSR предназначена для получения информации о текущей загрузке медиасервера. Уровень чувствительности устанавливается в конфигурационном файле MSR в параметре load-delta. Данный параметр определяет относительное изменение(сравнение текущей загрузки с предыдущей) загрузки msr(от 1 до 100), при которой формируется нотификации о текущей загрузки msr(не чаще 1 раза в секунду). Коэффициент загрузки отправляется в каждое ядро посредством SIP PUBLISH с Event eltex-load-sensor, в Body находится текущая загрузка msr.

Пример файла конфигурации:

<?xml version="1.0" encoding="utf-8"?>
<config date="20:05:00 09.07.2019">
    <general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10"
     spool-dir-size="100M"
     log-name="msr.log"
     log-path="/var/log/ecss/media-server" />
    <transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp" />
    <media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60"
     rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="1024"
     tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no"
     video-dscp="0" other-dscp="0"
     dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720" />
    <codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g729="0" speex="0" l16="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0" />
    <accounts>
        <dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" />
        <dynamic msr_name="msr_1" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" />
     </accounts>
    <pbyte>
        <mcc bind-addr="192.168.2.21" port="5700" />
    </pbyte>
</config
CODE

set

Команда предназначена для управления подписками о загрузке медиасервера.

Путь команды:

/system/media/msr/subscription/set

Синтаксис:

set <msr> <event> <property> <value>

Параметры:

  • <msr> - имя MSR;
  • <event> - eltex-call-count, имя события;
  • <property> - active - boolean, включить/выключить подписку;
  • expires - время жизни подписки, от 30 до 3600 сек.;
  • <value> - значение, в соответствии с форматом.

Пример:

admin@ds1@ecss1:/$ system/media/msr/subscription/set msr_1 eltex-call-count expires 30
 msr   msr_1
 event eltex-call-count
 set   expires
 from  60
 to    30

[exec at: 14.05.2019 23:12:23, exec time: 184ms, nodes: core1@ecss1

list

Команда для просмотра информации о состоянии подписки о загрузке медиасервера.

Путь команды:

/system/media/msr/subscription/list

Синтаксис:

list

Параметры:

  • MSR - имя MSR;
  • Is MSR registered? - зарегистрирован MSR или нет;
  • Event - Подписка на событие;
  • Active - активность;
  • Expires - время жизни подписки;
  • Notify - получено уведомлений;
  • Timestamp - время получения уведомления;
  • Event id - ID события;
  • Status - статус подписки.

Пример:

admin@ds1@ecss1:/$ system/media/msr/subscription/list                                                
 Subscriptions on msr
┌───────┬─────────────┬──────────────────┬────────┬─────────┬────────┬─────────────────────┬──────────────────┬────────┐
│  MSR  │   Is MSR    │      Event       │ Active │ Expires │ Notify │      Timestamp      │     Event id     │ Status │
│       │ registered? │                  │        │         │        │                     │                  │        │
├───────┼─────────────┼──────────────────┼────────┼─────────┼────────┼─────────────────────┼──────────────────┼────────┤
│ msr_1 │ true        │ eltex-call-count │ true   │      30 │      0 │ 2019/05/14 23:16:34 │ 0615cfa9332fdbbd │ active │
│ msr_2 │ true        │ eltex-call-count │ true   │      30 │      0 │ 2019/05/14 23:16:31 │ 0615cfa9f704d743 │ active │
└───────┴─────────────┴──────────────────┴────────┴─────────┴────────┴─────────────────────┴──────────────────┴────────┘

[exec at: 14.05.2019 23:16:36, exec time: 58ms, nodes: core1@ecss1