Skip to content
Опубликовано: 2014-11-05
Теги: asterisk linux freebsd

Проблемы точного времени в Asterisk

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

По умолчанию Asterisk установленный в Linux дистрибутиве использует timerfd (res_timing_timerfd.so). И с ним проблем нет. Но вот при установке Asterisk в FreeBSD он использует модуль kqueue (res_timing_kqueue.so). Начинает возникать куча странных проблем (например, загрузка процессора при воспроизведении moh, moh проигрывается слишком быстро/медленно, плохое качество голоса во время вызова, односторонняя слышимость или полная тишина во время разговора) и ошибок:

[Nov  1 08:47:14] WARNING[100187][C-000000a4]: channel.c:1309 __ast_queue_frame: Exceptionally long queue length queuing to SIP/xxx

Asterisk не проходит тесты для интерфейса точного времени:

asterisk*CLI> timing test
Attempting to test a timer with 50 ticks per second.
Using the 'kqueue' timing module for this test.
Timer failed to acknowledge.
Command 'timing test' failed.

Проверка используемого модуля для интерфейса точного времени:

asterisk*CLI> module show like timing
Module                         Description                              Use Count
res_timing_kqueue.so           KQueue Timing Interface                  1
res_timing_pthread.so          pthread Timing Interface                 0
2 modules loaded

Asterisk всегда хорошо работает через pthread, надо использовать его. Для устранения подобной проблемы отключим модуль res_timing_kqueue.so. Для этого в modules.conf прописывается:

noload => res_timing_kqueue.so

Снова проверяем используемые модули:

asterisk*CLI> module show like timing
Module                         Description                              Use Count
res_timing_pthread.so          pthread Timing Interface                 1
1 modules loaded

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

Если есть необходимость использовать какой-то специфичный модуль для интерфейса времени, то надо указать его предзагрузку в modules.conf, чтобы модуль загрузился первым:

preload => res_timing_dahdi.so