Оптимизация производительности Asterisk: пулы потоков, тюнинг PJSIP и выгрузка модулей
- Высокая утилизация CPU (100%) процессом
asteriskпри относительно небольшом количестве вызовов (100–200 CPS). - Задержки при поднятии трубки, «заикание» голосового меню IVR.
- Ошибки
taskprocessor queue reached high watermarkв журнале Asterisk. - Падение процесса с ошибкой исчерпания файловых дескрипторов
Too many open files.
1. Выгрузка неиспользуемых модулей в modules.conf
Уменьшите накладные расходы оперативной памяти и контекстных переключений, отключив устаревшие драйверы в /etc/asterisk/modules.conf:
[modules]
autoload=yes
; Отключение устаревших каналов
noload => chan_sip.so
noload => chan_iax2.so
noload => chan_skinny.so
noload => chan_unistim.so
noload => chan_mgcp.so
; Отключение неиспользуемых драйверов БД и приложений
noload => cdr_csv.so
noload => app_voicemail_imap.so
noload => res_adsi.so
noload => app_festival.so2. Тюнинг пулов потоков PJSIP (pjsip.conf)
Отредактируйте секцию [system] в /etc/asterisk/pjsip.conf для многоядерных процессоров:
[system]
type=system
threadpool_initial_size=50
threadpool_idle_timeout=60
threadpool_max_size=300
timer_t1=500
timer_b=320003. Увеличение системных лимитов (systemd limits)
Создайте оверрайд /etc/systemd/system/asterisk.service.d/override.conf:
[Service]
LimitNOFILE=1048576
LimitNPROC=524288
CPUSchedulingPolicy=rr
CPUSchedulingPriority=10systemctl daemon-reload && systemctl restart asterisk4. Мониторинг очередей taskprocessor в CLI
asterisk -rx "core show taskprocessors"
asterisk -rx "pjsip show threadpool" Частые вопросы (FAQ)
Что такое taskprocessors в Asterisk?
Taskprocessor — это внутренняя очередь задач Asterisk для асинхронной обработки событий (сигнализация, таймеры, запись). Если очередь переполняется (In-Queue растет), система начинает терять пакеты сигнализации.
Как транскодирование кодеков влияет на производительность CPU?
Транскодирование (например, из G.729 в Alaw или Opus) требует огромных ресурсов процессора. Всегда настраивайте транки и телефоны на использование нативных сквозных кодеков (alaw/ulaw), проверяя статус командой core show translation.
Стоит ли отключать запись CDR/CEL для увеличения производительности?
Прямая синхронная запись каждого чиха в удаленный MySQL блокирует потоки при задержках сети. Лучше использовать адаптивный буфер res_odbc или писать CDR в локальный CSV/SQLite с последующей асинхронной выгрузкой скриптом.
Как перевести логирование Asterisk в высокопроизводительный режим?
В logger.conf отключите debug и verbose на диск, оставив только warning и error. Включите direct_media в PJSIP везде, где абонентам не требуются функции записи и перехвата.