10

Тестирование системы

Метрики, стандарты, инструменты и методология нагрузочного тестирования телефонной системы. От измерения CPS и MOS до планирования ёмкости по формуле Эрланга.

Метрики телефонной системы

Что мы измеряем

Телефонная система отличается от веб-приложений: здесь важно не время ответа на HTTP-запрос, а качество голоса в реальном времени. Три категории метрик: нагрузка, качество и надёжность.

Что мы измеряем
    │
    ├─ Нагрузка
    │  ├─ CPS (Calls Per Second)
    │  ├─ Concurrent Calls
    │  └─ BHT (Busy Hour Traffic)
    │
    ├─ Качество
    │  ├─ MOS (Mean Opinion Score)
    │  ├─ Jitter
    │  ├─ Latency
    │  └─ Packet Loss
    │
    └─ Надёжность
       ├─ ASR (Answer Seizure Ratio)
       ├─ PDD (Post Dial Delay)
       ├─ Uptime
       └─ Failover Time
Рис. 1 — Иерархия метрик телефонной системы
Метрика Описание Хорошо Плохо
CPS Calls Per Second — сколько новых вызовов в секунду принимает система >50 <10
Concurrent Количество одновременных активных вызовов по плану CPU >80%
PDD Post Dial Delay — время от набора до начала звонка (гудков) <3 сек >8 сек
MOS Mean Opinion Score — субъективная оценка качества голоса (шкала 1–5) >4.0 <3.5
ASR Answer Seizure Ratio — процент успешных соединений >50% <30%
Jitter Вариация задержки между пакетами (нестабильность) <30 мс >50 мс
Latency Односторонняя задержка передачи голоса <150 мс >300 мс
Packet Loss Процент потерянных пакетов <1% >3%
BHT Busy Hour Traffic — нагрузка в час пик, измеряется в Эрлангах расчётное
MOS — главная метрика качества

MOS 4.0 — это «хорошо, как стационарный телефон». MOS 3.5 — «приемлемо, но слышны артефакты». Ниже 3.0 — пользователи будут жаловаться. G.711 без потерь даёт MOS ~4.4, Opus — до 4.9.

Стандарты и регламенты

Метрики телефонии определены международными стандартами. Эти документы описывают что измерять, как измерять и какие значения считать приемлемыми.

Стандарт Организация Описание
RFC 6076 IETF SIP Performance Metrics — определяет PDD, SRD (Session Request Delay), SDD (Session Disconnect Delay)
ITU-T G.107 ITU E-model — математическая модель расчёта качества голоса. Вычисляет R-фактор, из которого получается MOS
ITU-T P.800 ITU Методология MOS — как проводить субъективное тестирование качества голоса с участием людей
ITU-T P.862 ITU PESQ (Perceptual Evaluation of Speech Quality) — автоматическое измерение MOS без участия людей
ITU-T P.863 ITU POLQA (Perceptual Objective Listening Quality Analysis) — следующее поколение PESQ, поддерживает HD Voice
ITU-T Y.1540 ITU Параметры качества IP-сетей: допустимые задержки, потери пакетов, джиттер
ITU-T E.500 ITU Интенсивность трафика, формула Эрланга, Grade of Service (GoS)
R-фактор и MOS

E-model (G.107) вычисляет R-фактор (0–100) на основе задержки, джиттера, потерь и кодека. R-фактор конвертируется в MOS: R>90 → MOS>4.3 (отлично), R=70–80 → MOS 3.5–4.0 (приемлемо), R<60 → MOS<3.1 (плохо).

SIPp — нагрузочное тестирование

SIPp — отраслевой стандарт SIP-тестирования

SIPp — open-source инструмент для генерации SIP-трафика. Имитирует тысячи виртуальных телефонов, отправляет INVITE-сообщения, принимает ответы и генерирует RTP-трафик. Позволяет найти пределы системы до того, как это сделают реальные пользователи.

SIPp (генератор нагрузки)                  Тестируемая система
┌─────────────────────────┐               ┌─────────────────────┐
│                         │               │                     │
│  Имитирует 1000         │  ── INVITE ──> │  Kamailio / FS      │
│  виртуальных телефонов  │               │                     │
│                         │  <── 100 ──── │  Обрабатывает       │
│  Отправляет SIP INVITE  │  <── 200 OK ─ │  маршрутизирует     │
│  × 1000                 │               │  отвечает           │
│                         │  ──── ACK ──> │                     │
│  Генерирует RTP         │               │                     │
│  (имитация голоса)      │  ══ RTP ════> │  Медиа-обработка    │
│                         │               │                     │
└─────────────────────────┘               └─────────────────────┘
         │
         ▼
  Результаты:
  ├─ CPS: 47 calls/sec
  ├─ Max concurrent: 412
  ├─ PDD avg: 120ms
  ├─ Failed: 0.2%
  └─ Retransmissions: 15
Рис. 2 — Схема нагрузочного тестирования с помощью SIPp
Bash — Пример команды SIPp
# Базовый тест: 100 одновременных звонков, 10 новых в секунду sipp -sn uac \ -d 60000 \ # длительность звонка 60 сек -l 100 \ # макс. 100 одновременных -r 10 \ # 10 новых звонков/сек -rtp_echo \ # RTP echo (имитация разговора) -trace_stat \ # записывать статистику -trace_err \ # записывать ошибки kamailio.server:5060
Ключевые параметры

-sn uac — встроенный сценарий клиента (звонящий)
-d — длительность каждого звонка (мс)
-l — лимит одновременных вызовов
-r — скорость генерации (calls per second)
-rtp_echo — генерировать RTP-поток

Что SIPp умеет

— Имитировать тысячи SIP-телефонов
— Использовать пользовательские XML-сценарии
— Генерировать RTP-трафик
— Записывать детальную статистику в CSV
— Вставлять переменные (номера, пароли) из CSV-файла
— Работать как UAS (сервер) и UAC (клиент)

Пример XML-сценария SIPp (пользовательский)
XML — Сценарий исходящего вызова с аутентификацией
<?xml version="1.0" encoding="UTF-8"?> <scenario name="Authenticated Call"> <!-- Шаг 1: Отправляем INVITE --> <send retrans="500"> INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port] From: sipp <sip:sipp@[local_ip]>;tag=[call_number] To: <sip:[service]@[remote_ip]> Call-ID: [call_id] CSeq: 1 INVITE Contact: <sip:sipp@[local_ip]:[local_port]> Content-Type: application/sdp Content-Length: [len] v=0 o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip] s=- c=IN IP[media_ip_type] [media_ip] t=0 0 m=audio [media_port] RTP/AVP 0 a=rtpmap:0 PCMU/8000 </send> <!-- Шаг 2: Ждём ответ 100/180/200 --> <recv response="100" optional="true"/> <recv response="180" optional="true"/> <recv response="200" rtd="true"/> <!-- Шаг 3: ACK --> <send> ACK [next_url] SIP/2.0 [routes] </send> <!-- Шаг 4: Пауза (имитация разговора) --> <pause milliseconds="[duration]"/> <!-- Шаг 5: BYE --> <send retrans="500"> BYE [next_url] SIP/2.0 [routes] </send> <recv response="200" crlf="true"/> </scenario>

Четыре типа нагрузочных тестов

1. Ramp Test Нахождение предела

Цель: найти максимальную ёмкость системы.

Постепенно увеличиваем нагрузку, пока система не начнёт отказывать. Ответ: «наша система держит максимум 500 concurrent».

Нагрузка
  ▲
  │        ╱ ← отказ
  └──────────▶ Время
2. Soak Test Стабильность

Цель: проверить стабильность под длительной нагрузкой.

24–72 часа работы при 70% от максимума. Ищем: утечки памяти, деградацию производительности, зависания.

Нагрузка
  ▲
  │ ═══════════════════ 70%
  │
  │
  │
  └──────────────────▶ Время
       24-72 часа
3. Spike Test Всплеск

Цель: проверить реакцию на внезапный всплеск нагрузки.

Резкий пиковый всплеск нагрузки. Ответ: «система восстанавливается за 3 секунды».

Нагрузка
  ▲   ╱╲╱  ╲       ╱╲═╱════╲═════╱══╲═
  │
  └──────────────────▶ Время
4. Capacity Test Планирование

Цель: определить сколько серверов нужно для целевой нагрузки.

Вопрос: сколько серверов для 10 000 concurrent calls? Решение: формула Эрланга + результаты ramp test.

Серверы
  ▲
  │         10k calls
  │     
  └──────────────────▶ Нагрузка
Важно: тестируйте на отдельном сервере

SIPp должен работать на отдельной машине от тестируемой системы. Иначе генератор нагрузки будет конкурировать с системой за CPU и результаты будут искажены.

Формула Эрланга — расчёт ёмкости

Эрланг — единица телефонной нагрузки

1 Эрланг = один канал, занятый 100% времени (60 минут из 60). Если оператор разговаривает 45 минут в час, его нагрузка = 45/60 = 0.75 Эрланга. Формула Эрланга B рассчитывает, сколько каналов нужно для заданной нагрузки с допустимой вероятностью блокировки.

Практический пример

Задача: клиент имеет 400 операторов колл-центра. В час пик каждый разговаривает ~45 минут из 60. Сколько каналов (concurrent calls) нужно?

1
Интенсивность нагрузки: 400 операторов × (45/60) = 300 Эрланг
2
Формула Эрланга B (вероятность блокировки 1%): для 300 Эрланг нужно ≈ 320 каналов
3
Резерв +20%: 320 × 1.2 = 384 concurrent calls
Что это значит для инфраструктуры

FreeSWITCH: 1 CPU core ≈ 50–80 concurrent (с транскодингом) или 200–300 concurrent (без транскодинга). Для 384 concurrent нужно: ~2 сервера FreeSWITCH (или 1 мощный с 8+ ядрами).

Расчёт ёмкости:

400 операторов × 45 мин/час = 300 Эрланг
                                    │
                              Erlang B (P=1%)
                                    │
                                    ▼
                             320 каналов + 20% = 384 concurrent
                                    │
                         ┌──────────┴──────────┐
                         │                     │
                  С транскодингом        Без транскодинга
                  50-80 per core          200-300 per core
                  ≈ 5-8 ядер             ≈ 2 ядра
Рис. 3 — От количества операторов к числу серверов через формулу Эрланга
Подробнее о формуле Эрланга B

Формула Эрланга B (Erlang B):

B(N, A) = (A^N / N!) / Σ(k=0..N) (A^k / k!)

Где:
N — количество каналов (линий)
A — предлагаемая нагрузка в Эрлангах
B — вероятность блокировки (Grade of Service)

На практике используют таблицы Эрланга или онлайн-калькуляторы, а не считают вручную. Стандартный GoS для бизнеса — 1% (P.01), для экстренных служб — 0.1% (P.001).

Инструменты тестирования

Инструмент Назначение Бесплатный
SIPp Нагрузочное SIP-тестирование — генерация вызовов, измерение CPS и concurrent Да
Homer + HEP SIP-трафик capture и анализ — визуализация SIP-диалогов, поиск ошибок Да
VoIPmonitor Мониторинг качества голоса в реальном времени — MOS, jitter, потери пакетов Community
Grafana + Prometheus Дашборды мониторинга — CPU, память, количество каналов, тренды нагрузки Да
SRTP Tester Тестирование шифрования медиа — проверка корректности SRTP/DTLS Да
Opalvoip SIP-бенчмарки — альтернатива SIPp для специфичных сценариев Да
Twilio SIP Test Тестирование совместимости SIP-транков — проверка подключения к провайдерам Бесплатный
Homer SIP Capture

Homer перехватывает SIP-пакеты через HEP-протокол и визуализирует их как ladder-диаграммы. Видно каждый SIP-заголовок, каждый ответ, каждую ошибку. Незаменим для отладки проблем с маршрутизацией и регистрацией.

VoIPmonitor

Пассивно слушает RTP-потоки и рассчитывает MOS для каждого звонка в реальном времени. Показывает джиттер, потери, задержку. Сигнализирует, когда качество падает ниже порога. Интегрируется с Grafana.

Стек мониторинга для продакшена

Рекомендуемая связка: SIPp (нагрузочные тесты перед релизом) + Homer (SIP-отладка) + VoIPmonitor (качество голоса) + Grafana/Prometheus (системные метрики). Все инструменты бесплатны и open-source.

План тестирования нашей системы

Этот план выполняется на Фазе 2 (когда готовы Go API + ESL) и повторяется перед каждым значимым релизом. Цель — получить конкретные числа: «система держит X concurrent при MOS >4.0 и PDD <3 сек».

1
Подготовка среды: установить SIPp на отдельную машину, настроить Homer для захвата SIP-трафика, развернуть VoIPmonitor для мониторинга MOS.
2
Ramp Test — поиск предела: постепенно увеличиваем нагрузку от 1 CPS до отказа. Записываем максимальное CPS и concurrent.
3
Soak Test — 24 часа при 70%: держим 70% от найденного максимума. Ищем утечки памяти в FreeSWITCH и Go-сервисе.
4
Homer — анализ SIP: просматриваем все SIP-диалоги, ищем ошибки, ретрансмиссии, таймауты.
5
VoIPmonitor — контроль MOS: проверяем, что MOS не падает ниже 4.0 под нагрузкой. Фиксируем джиттер и потери.
6
Финальный отчёт: документируем результаты — максимум concurrent, CPS, MOS, PDD. Формулируем SLA.
Bash — Ramp Test: постепенное увеличение нагрузки
# Начинаем с 1 CPS, увеличиваем на 1 каждые 10 сек, до 100 CPS sipp -sn uac \ -r 1 \ # начальная скорость: 1 call/sec -rate_increase 1 \ # добавлять 1 call/sec -rate_max 100 \ # максимум 100 call/sec -rate_period 10000 \ # каждые 10 секунд -d 30000 \ # звонок длится 30 сек -l 1000 \ # макс. 1000 одновременных -rtp_echo \ -trace_stat \ -stf ramp_test_stats.csv \ kamailio.server:5060
Ожидаемый результат
Финальный отчёт тестирования:

┌────────────────────────────────────────┐
│  Система:    Kamailio + FreeSWITCH     │
│  Сервер:     8 vCPU, 16 GB RAM         │
│                                        │
│  Max CPS:         47 calls/sec         │
│  Max Concurrent:  412 calls             │
│  PDD avg:         120 ms                │
│  MOS avg:         4.2                   │
│  Failed:          0.2%                  │
│                                        │
│  Вердикт: система готова к продакшену  │
│  при нагрузке до 300 concurrent        │
└────────────────────────────────────────┘
Тестирование — это не разовое событие

Запускайте нагрузочные тесты перед каждым релизом, после обновления FreeSWITCH или Kamailio, при изменении конфигурации кодеков или маршрутизации. Автоматизируйте через CI/CD.