понедельник, 5 октября 2009 г.

Asterisk: аппаратное эхоподавление - как уменьшить нагрузку системы на 70%

Почему важно снижать нагрузку на системе, на которой установлен Asterisk?

Высокая нагрузка на систему — обычное дело в в системе, являющейся шлюзом в ТФОП.

Общеизвестно, что Asterisk более стабилен, если работает на малонагруженной системе . Поэтому если вы строите крупные системы, поддерживающие 400 одновременных вызово и выше, то вам могут понадобиться дополнительные серверы, чтобы справиться с такой нагрузкой. В данный момент к интегрированным АТС можно подключать только несколько аналоговых портов. Путем снижения нагрузки к ним можно подключать порты E1/T1 и обрабатывать в десятки раз большее количество вызовов.

Итак, как это сделать?



Регулируем размер chunk в Zaptel/dahdi
По-умолчанию, zaptel/dahdi использует chunk size = 8 байт.В сервере, на платах телефонии, это приравнивается к одному прерыванию каждую 1мс. Размер chunk size выбран таким из-за программного эхоподавления, которое включено по-умолчанию в драйверах dahdi/zaptel .
Однако еще в 2005 году Sangoma представила сообществу Asterisk аппаратное эхоподавление. С тех пор такое ограничение chunk size осталось актуальным только для маленьких аналоговых карт, которые все еще используют программное эхоподавление
В связи с этим, разработчики zaptel/dahdi добавили возможность менять размер chunk size для всех плат, поддерживающих аппаратное эхоподавление.
Все платы Sangoma, кроме аналоговых, поддерживают автоматическое определение параметра chunk size в драйвере zaptel/dahdi и установка оптимального значения .Вы можете настроить chunk size в zaptel/dahdi вручную - 8 байт (1мс - по-умолчанию), 16 байт (2 мс) , 40 байт (5мс) или 80 байт (10 мс).

Чем это поможет?

Увеличение chunk size позволяет снизить колличество прерываний и контекстных переключений для драйвера. Вы можете понять это, сравнив колличество прерываний, которые совершаются раз в 1мс, с прерываниями каждые 10мс, т.е. в 10 раз меньше. Множество прерывания и контекстных переключений создает нагрузку даже на системе, которая не обрабатывает вызовы! 
Снижение нагрузки в разных случаях будет разным, т.к. колличество контекстных переключений зависит от колличества входящих вызовов ( колличество прерываний не зависит ) .


Где доказательства?

Тестовая система:
Аппаратная конфигурация
Наименование
Детали
Колличество
ЦПУ
Intel® Core™2 Quad CPU Q9550 @ 2.83GHz
1
Обьем ОЗУ
4ГБ
1
Карты ТФОП
Sangoma A108D (8-портовая цифровая плата поддержкой аппаратного эхоподавления) . Данные платы поддерживают 496 одновременных вызова (31
каналов на поток x 16 потоков E1 ).
2


Для тестов будет использоваться небольшая программа, эмулирующая интерфейс Asterisk – zaptel/dahdi . Данная программа исполняется в пользовательском пространстве и эмитирует нагрузку которая похожа на реальную нагрузку на Asterisk.Производительность на реальном Asterisk'e получится такой же, с небольшими отклонениями



На графике показана зависимость загрузки системы в зависимоти от параметра chunk size. При 496 одновременных вызовах нагрузка на систему упала с 26% до 7% вместе с изменением chunk size с 8 байт (1мс) до 80 байт (10 мс). Производительность системы снизилась более чем на 70%! .Без телефонных вызово нагрузка на систему упала с 15% до 1%
В ходе эскпериментов выяснилось, что оптимальным размером chunk size = 40 байт,- это максимум, при котором meetme и “music on hold” работают стабильно.

Есть ли ограничения?

1. Данный способ не работает на аналоговых и T1/E1 E&M интерфейсных плат. Потому что драйвер zaptel/dahdi, при работе с аналоговыми платами, все еще сильно зависит от параметра chunk size равным 8 байт.
2. Вы должны использовать аппаратное эхоподавление. Изменение chunk size не рекомендуется для систем использующих программное эхоподавление.
3. Данный способ не работает для Sangoma’s SMG/boost решений ,
т.к. они используют chan_woomera. Если Вы нуждаетесь в повышении производительности при работе SMG/boost, свяжитесь с отделом продаж Sangoma sales@sangoma.com.

Как проводились исследования?

Перед изменением chunk size полезно прочитать статью Wanpipe Asterisk Install
Настройка chunk size в драйвере zaptel/dahdi при помощи драйверов Winpipe ( Setup вы можете найти, скачав драйверы WinPipe ) :
./Setup install --zap-chunk=CHUNK SIZE
Где CHUNK SIZE 8, 16 , 40 или 80.
Setup изменяет исходный код zaptel/dahdi для смены chunk size и удаляет дравера плат wct4xxx (Digium) из драверов zaptel/dahdi.Т.к. Платы wct4xxx не поддерживают изменение значения chunk size их необходимо удалить из zapel/dahdi. Далее скрипт автоматически перекомпилирует winpipe и zaptel/dahdi. Никаких дополнительных настроек не требуется. 
 
Просто запускаем wipipe,dahdi и Asterisk:
wanrouter start
ztcfg –vvv
asterisk -c -r
Чтобы убедиться, что chunk size изменился, нужно дать команду:
ifconfig w1g1
В выводе ifconfig MTU=chunk size

Приложение

Конфигурация сервера:


Machine Info:
cat /proc/cpu
[root@tesla ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz
stepping : 10
cpu MHz : 2842.866
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
fl ags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl ush
dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx smx est
tm2 cx16 xtpr lahf_lm
bogomips : 5688.50
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz
stepping : 10
cpu MHz : 2842.866
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 4
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
fl ags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl ush
dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx smx est
tm2 cx16 xtpr lahf_lm
bogomips : 5685.57
processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz
stepping : 10
cpu MHz : 2842.866
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
fl ags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl ush
dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx smx est
tm2 cx16 xtpr lahf_lm
bogomips : 5685.59
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz
stepping : 10
cpu MHz : 2842.866
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
fl ags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl ush
dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx smx est
tm2 cx16 xtpr lahf_lm
bogomips : 5685.60
cat /proc/memory
[root@tesla ~]# cat /proc/meminfo
MemTotal: 3369408 kB
MemFree: 880972 kB
Buffers: 593672 kB
Cached: 1377928 kB
SwapCached: 0 kB
Active: 910204 kB
Inactive: 1285396 kB
HighTotal: 2489856 kB
HighFree: 868080 kB
LowTotal: 879552 kB
LowFree: 12892 kB
SwapTotal: 923728 kB
SwapFree: 923728 kB
Dirty: 80 kB
Writeback: 0 kB
AnonPages: 223984 kB
Mapped: 67616 kB
Slab: 266820 kB
PageTables: 5708 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 2608432 kB
Committed_AS: 410352 kB
VmallocTotal: 114680 kB
VmallocUsed: 45960 kB
VmallocChunk: 64500 kB
HugePages_Total: 0
HugePages_Free: 0
Typical vmstat outputs
Chunk size= 8 bytes, no load
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 798684 591196 1459432 0 0 0 0 3027 514 0 14 86 0 0
Chunk size= 8 bytes, 496 channels
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 625020 589796 1459612 0 0 0 0 3071 65015 12 26 62 0 0
_______________________________________________
Chunk size= 80 bytes, no load
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 882400 593672 1377936 0 0 0 0 1226 446 0 1 99 0 0
Chunk size= 80 bytes, 496 channels
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 0 706272 591500 1377936 0 0 0 0 1209 46195 12 6 81 0 0

Комментариев нет:

Отправить комментарий