Skip to content

Opensips blog

Заметки voip инженера

  • Готовые сервисы
    • PUSH NOTIFICATIONS API
  • Kamailio
  • Opensips
  • О себе и реквизиты

High load. Высокая нагрузка на сервер Астериск.

2017-11-27 yooxyman

В рамках проекта с высокой нагрузкой нужно было решить проблему, описание которой звучит так: После 360 секунд вызовы переставали попадать в биллинг. Первонаперво была выяснена причина это отсутствие некоторых переменных, получаемых через AGI интерфейс php скриптом. При этом, если использовать AGI то такой проблемы не наблюдалось.
В нашем случае используется FASTAGI и связка ASterisk, xinetd, phpagi-fastagi.php, myscript.php.

Поиск решений занял несколько дней, потому, что нагрузка на сервер была высокой итак: 1. Обнаружили что mysript.php не получает значение переменной DIALSTATUS после выполнения команды DIAL. И поиск в интернете ничего не давал, пока я не набрел на собственно код phpagi библиотеки на sourceforge.net. (https://sourceforge.net/p/phpagi)
И в багтреке были прикреплены несколько вопросов именно по поводу переменной DIALSTATUS. Но комментиариев с решением под ними не было, а были они в «обсуждениях», вот здесь: https://sourceforge.net/p/phpagi/discussion/366892/thread/5a4c09f0/

В двух словах, phpagi Общается с асетриском через потоки как будто пишет и читает из файла строки, и вот какое дело, иногда когда скрипт читает данные из потока он получает толи пустые строки толи что, и не может получить значение переменной, хотя по agi debug четко видно, переменная передается скрипту.

Было два решения которые предложила система, это а) повторить запрос переменной несколько раз, пример:
function get_var($agi_in, $value)
{
$temp = $agi_in->get_variable($value);
$temp = $agi_in->get_variable($value);
$temp = $agi_in->get_variable($value);
$temp = $temp;
$agi_in->verbose($value." :".$temp);
return $temp;
}

б) решить вопрос кардинально, но я это решение реализовать не смог, т.к. до конца не понял как работают стримы и куда вставить код.

function evaluate($command)
{
//clear the buffer
stream_set_blocking($this->in,0);
do {
$line = fgets($this->in);
} while ($line);
stream_set_blocking($this->in,1);

Всем пока.

Posted in Asterisk, Проблемы в кодеTagged asterisk, dialstatus, fastagi, phpagi, xinetd

Навигация по записям

Неплохо бомбилo с ubuntu и boot разделом
настройка centos для обработки большого кол-ва соединений

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

Для отправки комментария вам необходимо авторизоваться.

My Profile

Eremin Pavel

Voip developer

P: 79227502213

E: eremina.net@gmail.com

Hire me on Freelancer.com

Облако

AMI (4) asterisk (18) centos (4) centos 7 (3) certbot (2) certificate (2) debian (2) duplicate (2) elastix (3) error (3) events (2) fail (3) freepbx (8) g729 (2) google (2) ios (2) issabel (4) issue (2) Kamailio (8) limit (2) Load (3) local (2) Mysql (8) nat (2) opensips (11) PAMI (2) performance (2) pjsip (2) provisioning (2) push (2) re-invite (2) rtpengine (2) SBC (2) server (2) ssh (2) ssl (2) tcp (2) timeout (2) tls (3) vmware (2) voip (2) wav (2) webrtc (2) windows (3) zoiper (2)

Свежие записи

  • asterisk 16. webrtc. sipml5
  • esxi useful command. vmware.
  • opensips as SBC
  • sipdump per day. compressed. heplify.
  • kamailio. siremis. xmlrpc. jsonrpc.

Управление

  • Войти
  • Лента записей
  • Лента комментариев
  • WordPress.org

© 2021 Opensips blog

Proudly powered by WordPress | Theme: x-blog by wpthemespace.com