Добрый день. Имеется чистый Астериск 14.7.6. На нем настроено ~150 одноканальных транков на Билайн. На этот Астериск приходят звонки с поставщика, и дальше, по префиксу отправляются на один из свободных транков Билайна. Одноканальность реализована при помощи call-limit=1, в настройках транков, т.к. Билайн на своей стороне этого сделать не может. В данный момент диалплан выглядит вот так
exten => _#777X.,1,Set(GMIN=1) ;номер первого транка
exten => _#777X.,n,Set(GMAX=50) ;номер последнего транка
exten => _#777X.,n,Set(COUNT=$[${GMAX}-${GMIN}+1])
exten => _#777X.,n,Set(GATE=${RAND(${GMIN},${GMAX})})
exten => _#777X.,n(noop),Noop(call trying, COUNT= ${COUNT})
exten => _#777X.,n,GotoIf($[${COUNT} > 0]?:hangup)
exten => _#777X.,n,Set(COUNT=$[${COUNT} - 1])
exten => _#777X.,n,Dial(SIP/beeline-${GATE}/${EXTEN:4})
exten => _#777X.,n,GotoIf($[$["${DIALSTATUS}" = "CHANUNAVAIL"] || $["${DIALSTATUS}" = "CONGESTION"]]?:hangup)
exten => _#777X.,n,GotoIf($[${GATE} < ${GMAX}]?add)
exten => _#777X.,n,Set(GATE=${GMIN})
exten => _#777X.,n,Goto(noop)
exten => _#777X.,n(add),Set(GATE=$[${GATE} + 1])
exten => _#777X.,n,Goto(noop)
exten => _#777X.,n(hangup),Hangup
Т.е. берется случайный транк и на него пробуем звонить, если он занят, берем следующий транк, если и он занят, то следующий и так далее, пока не найдем свободный. Все в целом работает, но при учете пары сотен одновременных звонков возникает очень большое число ошибок такого вида
WARNING[12410][C-000f3a06]: taskprocessor.c:888 taskprocessor_push: The 'subm:endpoint_topic_all-cached-00000007' task processor queue reached 500 scheduled tasks again.
И такого, при которых приходит отбой - 403 ошибка
ERROR[12272][C-000f39a9]: res_rtp_asterisk.c:3126 ast_rtp_new: Oh dear... we couldn't allocate a port for RTP instance '0x7f4ed046f998'
WARNING[12272][C-000f39a9]: app_dial.c:2530 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)
Которые, как я понимаю, вызваны перегрузкой астера постоянным перебором доступного транка. LA 1min на ЦПУ при этом примерно 2,5-3.
В интернете прочитал, что ошибку с переполненной очередью может давать модуль PJSIP (который я не использую), но его отключение вроде не принесло никаких изменений. Подскажите, пожалуйста, как можно решить эти проблемы , можно у меня клешни не правильно работают и я диалплан коряво составил ?
Ну так у вас на каждый звонок(включая звонки на несуществующий номер) выполняется
8*150 = 1200!!!
переходов + 150 канальных операций, в случае если заняты 149 транков.
С чего вы удивляетесь?
Делайте все звонки рандомно, проверяйте состояние транка перед попыткой звонка.
А еще лучше - отслеживайте состояние транка во внешнем приложении и не звоните чаще раза в 5 секунд на транк и не звоните на занятый.
Тоесть да, у вас клешни(пропустили в универе оценки сложности) и канал тут непричем совершенно.
задра**вать каналы много ума не надо.
call-limit давно уже DEPRICATED.
Используйте GROUP_COUNT() см. тут и если свободен, тогда уж и звоните...
Задан: 2018-12-18 11:56:19 +0400
Просмотрен: 3,252 раз
Обновлен: Dec 19 '18
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.