Яндекс.Метрика

RealTime в Asterisk: архитектура и конфигурация

RealTime в Asterisk: архитектура и конфигурация с 5 октября по 9 октября

Количество
свободных мест

8 Записаться

Курсы по Mikrotik MTCNA

Курсы по Mikrotik MTCNA с 6 апреля по 10 апреля

Количество
свободных мест

1 Записаться

Курс по Zabbix

Zabbix: мониторинг Asterisk и VoIP с 7 сентября по 11 сентября

Количество
свободных мест

8 Записаться
Проблемы архитектуры Asterisk и как с ними жить и не спиться
73
Доклад
Михаил Замятин
Проблемы архитектуры Asterisk и как с ними жить и не спиться

Asterisk уже много лет считается «золотым стандартом» для построения систем офисной телефонии. Но если заглянуть под капот, выясняется, что это не просто удобная программа, а огромный, тяжелый и местами довольно неповоротливый механизм. Проект живет за счет мощного комьюнити, но именно это порождает свои нюансы. Когда сотни людей пишут код в разные части системы, архитектура начинает напоминать лоскутное одеяло. Чтобы эффективно работать с этой АТС, нужно понимать, как она устроена на самом деле, какие костыли в ней заложены исторически и почему она иногда ведет себя непредсказуемо.

Как устроена связь: Клиент-сервер и UnixSocket

Многие привыкли воспринимать Asterisk как монолитное приложение, но на деле это классическая клиент-серверная архитектура. Основной программный код — это серверная часть. А когда мы запускаем в терминале команду asterisk -r, мы всего лишь открываем клиентское приложение. Этот клиент сам по себе не умеет ничего — он не обрабатывает звонки и не хранит настройки. Он просто подключается к серверу, чтобы показать нам, что там происходит.

Важный технический момент: связь между клиентом и сервером идет не через обычную сеть, а через UnixSocket. Это позволяет безопасно передавать данные внутри одной операционной системы. Именно через этот сокет клиент запрашивает информацию о состоянии каналов, эндпоинтах PJSIP или загруженных модулях. Если сервер «завис» или перегружен настолько, что перестал отвечать на запросы в сокет, ваш клиент -r тоже перестанет подавать признаки жизни.

Базовый фундамент: на чем все держится

Чтобы Asterisk вообще запустился, ему нужны определенные библиотеки. Без них ядро просто не соберется. Это своего рода «минимальный набор выживания»:

  • libEdit: Библиотека для работы с командной строкой. Именно благодаря ей работают автодополнения по Tab и история команд в консоли.
  • libJanson (JSON): Начиная с 13-й версии, JSON стал стандартом. Без этой библиотеки Asterisk не сможет обрабатывать современные структуры данных, которые используются почти везде.
  • OpenSSL: Критически важная вещь. Любое шифрование, будь то TLS для сигнализации или SRTP для голоса, опирается на OpenSSL.

Это база. На нее уже сверху накручиваются модули, которые превращают голый код в полноценную телефонную станцию.

Иерархия модулей: Ядро, Интерфейсы и Бизнес-логика

Вся мощь Asterisk — в его модульности. Но модули здесь не равноправны. Их можно разделить на три большие группы, и понимание этой разницы помогает при поиске проблем.

1. Модули ядра (Core)
Это «неотключаемые» части системы. Сюда входит сам механизм PBX, управление каналами (channels), работа с мостами (bridge) и система Stasis. Вы не можете просто взять и выгрузить модуль управления каналами, потому что на нем держится всё. Эти компоненты прописаны в самом сердце системы, и именно в них чаще всего зарыты самые сложные архитектурные проблемы.

2. Интерфейсные или загружаемые модули
Это драйверы протоколов и технологий.

  • chan_pjsip: современный стек SIP, который пришел на смену старому.
  • chan_sip: старый добрый (и официально устаревший) драйвер.
  • Кодеки и форматы файлов: то, что позволяет системе «понимать» голос и записывать его на диск.
    Эти модули можно подключать и отключать. Именно здесь происходит установка Asterisk в контексте выбора нужного функционала под конкретную задачу.

3. Бизнес-модули
Это то, с чем мы работаем в диалплане. Функции вроде RAND, приложения для очередей или проигрывания файлов. Если вам не нужны очереди, вы можете просто не загружать соответствующий модуль, и система станет чуть легче.

Реальность через призму Jira: баги, фичи и NAT

Если зайти в Jira (систему трекинга задач) проекта Asterisk, можно увидеть реальную картину мира. Статистика впечатляет: за год пользователи создают тысячи тикетов.

  • Огромный поток задач: Около 2100 багов и более 3500 запросов на новые фичи за короткий период. Всего в базе более 25 000 обращений. Это говорит о том, что проект живой, но и проблем в нем хватает.
  • Проблемы безопасности: Удивительно, но реальных дыр в безопасности (security issues) крайне мало — буквально пару десятков на тысячи тикетов. Это значит, что защита IP-ATC на уровне самого кода Asterisk реализована неплохо.
  • Миф о багах в коде: Почти 90% жалоб на «плохую работу SIP» или «пропадание голоса» на самом деле связаны с некорректной настройкой NAT на стороне пользователя или сетевого оборудования. Люди пишут в Jira, думая, что нашли баг, а на деле они просто не пробросили порты или не настроили external_address.

Поскольку разработкой занимаются разные люди (мейнтейнеры), исправление ошибок может занимать месяцы. Один человек отвечает за AppDial, другой — за PJSIP. Если у того, кто пишет PJSIP, сейчас нет времени, ваш баг будет висеть долго, даже если он критический.

Проблема языка C: ручное управление и «выстрелы в ногу»

Asterisk написан на языке C. Для телефонии это круто, потому что это быстро. Но у C есть огромный минус — там нет автоматической очистки памяти. Разработчик сам должен выделить память под переменную и сам должен её освободить.

В проекте, которому 20 лет и в котором миллионы строк кода, уследить за этим невозможно. Утечки памяти — это верный спутник Asterisk. Если где-то в модуле забыли освободить пару байт при каждом звонке, то через неделю работы ваш сервер просто «съест» всю оперативку и упадет. Кроме того, ошибки с указателями приводят к так называемым Segmentation Fault. Это когда программа пытается обратиться к памяти, которая ей не принадлежит, и операционная система её мгновенно прибивает. Именно поэтому аудит IP-ATC часто выявляет нестабильность системы именно из-за накопленных ошибок в памяти.

Ловушка многопоточности: Mutex и блокировки

Современный сервер — это много ядер и много потоков. Asterisk активно создает потоки для каждого звонка, для каждой задачи. И тут возникает главная архитектурная беда — Locks (блокировки).

Чтобы два потока не начали одновременно менять данные одного и того же канала (например, записывать в него звук), используется механизм Mutex. Когда один поток работает с объектом, он его «лочит» (блокирует). Все остальные потоки, которым нужен этот же объект, встают в очередь и ждут.

В чем здесь проблема:

  1. При высокой нагрузке (много звонков в секунду) количество этих блокировок растет в геометрической прогрессии.
  2. Возникают ситуации Deadlock, когда поток А ждет поток Б, а поток Б ждет поток А. Система замирает.
  3. Чем больше ядер в процессоре, тем больше времени тратится не на полезную работу, а на борьбу за блокировки.

Это родовая травма Asterisk. Переписать это невозможно, не переписав всё ядро с нуля. Поэтому на определенных нагрузках Asterisk начинает «захлебываться» вне зависимости от мощности железа.

Дисковая подсистема и узкое место AstDB

Внутри Asterisk есть своя база данных — AstDB. Она построена на SQLite. Проблема в том, что по умолчанию она живет прямо на диске. Каждый раз, когда телефон регистрируется или меняет статус, происходит запись на диск.

Если у вас 1000 внутренних абонентов и они часто перерегистрируются, ваша дисковая подсистема будет постоянно занята. В то время как другие системы (например, FreeSwitch) давно хранят такие оперативные данные в памяти, Asterisk продолжает «мучить» жесткий диск или SSD. Если диск медленный или начал «сыпаться», тормозить будет вся телефония.

Производительность: мифы и реальные цифры

Часто спрашивают: «Сколько звонков выдержит Asterisk?». Ответ всегда индивидуален, но есть архитектурные пределы.

  • CPS (Calls Per Second): В среднем, «чистый» Asterisk без сторонних балансировщиков начинает вести себя нестабильно уже при 40–50 новых вызовах в секунду. Для сравнения, специализированные SIP-прокси держат тысячи CPS.
  • Бриджинг (смешивание каналов): Создание моста между звонящим и оператором — это тяжелая операция. Каждый новый Bridge — это дополнительные блокировки и нагрузка на ядро.
  • Очереди и IVR: Чем сложнее логика в диалплане, тем быстрее вы упретесь в потолок производительности. Если ваша система перегружена, может потребоваться модернизация АТС с выносом части функций на отдельные серверы.

Для тех, кто хочет серьезно разобраться в настройке и оптимизации, существуют профильные курсы по Asterisk
, где эти моменты разбираются на практике.

«Призраки в машине»: Зависшие каналы

Это, пожалуй, самая известная «болячка». Вы заходите в консоль и видите, что в системе висит 500 каналов, хотя на самом деле никто не разговаривает. Это происходит из-за того, что логика завершения звонка где-то дала сбой — либо из-за проблем в сети, либо из-за ошибки в коде модуля.

В индустрии есть негласное правило: сервер с Asterisk нужно перезагружать. Кто-то делает это раз в неделю, кто-то раз в 48 часов. Как бы хорошо вы ни настроили систему, со временем в ней накапливается «мусор»: утечки памяти, зависшие каналы, заблокированные объекты. Перезагрузка — это самый простой (хоть и не самый изящный) способ вернуть систему в чувство.

Практические советы по выживанию

Чтобы Asterisk работал долго и счастливо, стоит придерживаться нескольких правил:

  • Не перегружайте диалплан: Если можно сделать логику на внешнем скрипте (через FastAGI), лучше сделайте это там.
  • Следите за NAT: Используйте только chan_pjsip для новых инсталляций, он лучше справляется с сетевыми нюансами.
  • Настраивайте QoS: Приоритезация трафика QoS поможет голосу пробиться через забитый канал, даже если сервер загружен.
  • Используйте внешние БД: Для хранения CDR и тяжелых данных используйте MySQL или PostgreSQL на отдельном сервере, чтобы не нагружать AstDB.
 

Заключение

Asterisk — это легендарный продукт, но он не всесилен. Его архитектура несет в себе груз решений двадцатилетней давности. Понимая ограничения по количеству блокировок, специфику работы с памятью и диском, можно строить очень надежные системы. Главное — не пытаться сделать из Asterisk высоконагруженный операторский свитч на миллион абонентов без использования вспомогательных инструментов вроде Kamailio. В умелых руках это мощнейший конструктор, в неумелых — источник постоянных ребутов и жалоб на качество связи. Практическая ценность Asterisk в его гибкости, и именно за это ему прощают все архитектурные несовершенства.

Ежегодная конференция по Asterisk 2026!

Билеты уже в продаже!

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

Наши
клиенты

Посмотреть все