As far as I understand, you mesn that async reactor should be implemented in the sip server, and using this approach it will act much better under load.
But at the moment I am testing with just 3 users. So server should perfom perfectly under this kind of load. Maybe it's vonfiguration problem? > On 08 May 2014, at 13:46, [email protected] wrote: > > The problem is that originally only UDP transport was considered which was > enough to run VoIP calls. Sending UDP is not blocking while using TCP is. > TCP connections don’t work well without using an asynchronous reactor, > especially under load the problem becomes visible. Ideally, the core should > be based on such concept but we are not there yet. > > Adrian > >> On 08 May 2014, at 06:32, Maksim Solovjov <[email protected]> wrote: >> >> Thank you for your answer. Can you elaborate on "voice switch and voice >> calls only"? >> >> So there is nothing I can do about it? To make a connection working fast and >> reliable? >> >>> On 08 May 2014, at 04:07, [email protected] wrote: >>> >>> You are confronted with the classic problem “this voice switch was designed >>> to handle UDP and voice calls only” problem. >>> >>> This is a VoIP industry level problem, which is yet to be properly >>> addressed by anyone in the field. >>> >>> Adrian >>> >>>> On 07 May 2014, at 21:16, Maksim Solovjov <[email protected]> wrote: >>>> >>>> Hello, >>>> >>>> From time to time I am encountering a problem while sending instant >>>> messages ( using sip MESSAGE request ) or sending call invites. >>>> Sometimes it works well and fast, sometimes it doesn't, sometimes >>>> messages are delivered very slowly. With two last options ( doesn't >>>> work at all and/or messages are delivered slowly ), I get the >>>> following errors: >>>> >>>> ERROR:core:tcp_blocking_connect: timeout 10 s elapsed from 10 s >>>> ERROR:core:tcpconn_connect: tcp_blocking_connect failed >>>> ERROR:core:tcp_send: connect failed >>>> ERROR:tm:msg_send: tcp_send failed >>>> ERROR:tm:t_forward_nonack: sending request failed >>>> >>>> My devices are behind NAT ( mobile phones ) and I am using pjsip with >>>> tcp connection. >>>> Moreover I am trying to set up a persistent connection and hope, that >>>> server will reuse it, when it needs to send something. I am sending >>>> keep-alive packets every 600 seconds and I am not using any STUN or >>>> TURN servers. >>>> >>>> My opensips and rtpproxy are running on EC2, so are behind NAT as well. >>>> And I don't have any STUN or TURN servers intalled ( should I install >>>> any of it? ) >>>> >>>> Any help, advice or suggestions would be highly appreciated! >>>> Here is my opensips.cfg, please help: >>>> >>>> debug=3 >>>> log_stderror=no >>>> log_facility=LOG_LOCAL1 >>>> >>>> fork=yes >>>> children=4 >>>> >>>> dns=no >>>> rev_dns=no >>>> >>>> disable_tcp=no >>>> >>>> listen=udp:private-ip:5060 # CUSTOMIZE ME >>>> listen=tcp:private-ip:5060 >>>> >>>> advertised_address="public-ip" >>>> alias="public-ip:5060" >>>> alias="domain.com:5060" #// NB!! domain address is not associated with >>>> public-ip ( using A record ) >>>> >>>> db_default_url="mysql://opensips:opensipsrw@database-url/opensips" >>>> >>>> mpath="/usr/lib64/opensips/modules/" >>>> >>>> ### MYSQL module >>>> loadmodule "db_mysql.so" >>>> >>>> ### Domain module >>>> loadmodule "domain.so" >>>> modparam("domain", "db_url", >>>> "mysql://opensips:opensipsrw@database-url/opensips") >>>> >>>> >>>> #### SIGNALING module >>>> loadmodule "signaling.so" >>>> >>>> #### StateLess module >>>> loadmodule "sl.so" >>>> >>>> #### Transaction Module >>>> loadmodule "tm.so" >>>> modparam("tm", "fr_timer", 5) >>>> modparam("tm", "fr_inv_timer", 30) >>>> modparam("tm", "restart_fr_on_each_reply", 0) >>>> modparam("tm", "onreply_avp_mode", 1) >>>> >>>> #### Record Route Module >>>> loadmodule "rr.so" >>>> /* do not append from tag to the RR (no need for this script) */ >>>> modparam("rr", "append_fromtag", 0) >>>> >>>> #### MAX ForWarD module >>>> loadmodule "maxfwd.so" >>>> >>>> #### SIP MSG OPerationS module >>>> loadmodule "sipmsgops.so" >>>> >>>> #### FIFO Management Interface >>>> loadmodule "mi_fifo.so" >>>> modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo") >>>> modparam("mi_fifo", "fifo_mode", 0666) >>>> >>>> #### URI module >>>> loadmodule "uri.so" >>>> modparam("uri", "use_uri_table", 0) >>>> >>>> #### USeR LOCation module >>>> loadmodule "usrloc.so" >>>> modparam("usrloc", "nat_bflag", "NAT") >>>> modparam("usrloc", "db_mode", 0) >>>> >>>> #### REGISTRAR module >>>> loadmodule "registrar.so" >>>> modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT") >>>> modparam("registrar", "received_avp", "$avp(rcv)") >>>> >>>> loadmodule "nathelper.so" >>>> modparam("nathelper", "received_avp", "$avp(rcv)") >>>> >>>> loadmodule "rtpproxy.so" >>>> modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:12221") >>>> >>>> #### ACCounting module >>>> loadmodule "acc.so" >>>> modparam("acc", "early_media", 0) >>>> modparam("acc", "report_cancels", 0) >>>> modparam("acc", "detect_direction", 0) >>>> modparam("acc", "failed_transaction_flag", "ACC_FAILED") >>>> modparam("acc", "log_flag", "ACC_DO") >>>> modparam("acc", "log_missed_flag", "ACC_MISSED") >>>> >>>> >>>> route{ >>>> >>>> force_rport(); #nathelper >>>> if (nat_uac_test("23")) { #nathelper >>>> if (is_method("REGISTER")) { >>>> fix_nated_register(); #nathelper >>>> setbflag(NAT); >>>> } else { >>>> fix_nated_contact(); #nathelper >>>> setflag(NAT); >>>> } >>>> } >>>> >>>> if (!mf_process_maxfwd_header("10")) { >>>> sl_send_reply("483","Too Many Hops"); >>>> exit; >>>> } >>>> if (has_totag()) { >>>> # sequential requests within a dialog should >>>> # take the path determined by record-routing >>>> if (loose_route()) { >>>> >>>> if (is_method("BYE")) { >>>> setflag(ACC_DO); # do accounting ... >>>> setflag(ACC_FAILED); # ... even if the >>>> transaction fails >>>> } else if (is_method("INVITE")) { >>>> # even if in most of the cases is >>>> useless, do RR for >>>> # re-INVITEs alos, as some buggy >>>> clients do change route set >>>> # during the dialog. >>>> record_route(); >>>> } >>>> >>>> if (check_route_param("nat=yes")) >>>> setflag(NAT); >>>> >>>> # route it out to whatever destination was set >>>> by loose_route() >>>> # in $du (destination URI). >>>> route(relay); >>>> } else { >>>> if ( is_method("ACK") ) { >>>> if ( t_check_trans() ) { >>>> # non loose-route, but >>>> stateful ACK; must be an ACK after >>>> # a 487 or e.g. 404 from upstream >>>> server >>>> t_relay(); >>>> exit; >>>> } else { >>>> # ACK without matching transaction -> >>>> # ignore and discard >>>> exit; >>>> } >>>> } >>>> sl_send_reply("404","Not here"); >>>> } >>>> exit; >>>> } >>>> # CANCEL processing >>>> if (is_method("CANCEL")) >>>> { >>>> if (t_check_trans()) >>>> t_relay(); >>>> exit; >>>> } >>>> >>>> t_check_trans(); >>>> >>>> if ( !(is_method("REGISTER") ) ) { >>>> if (from_uri==myself) >>>> { >>>> } else { >>>> # if caller is not local, then called number >>>> must be local >>>> if (!uri==myself) { >>>> send_reply("403","Rely forbidden"); >>>> exit; >>>> } >>>> } >>>> } >>>> # preloaded route checking >>>> if (loose_route()) { >>>> xlog("L_ERR", >>>> "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]"); >>>> if (!is_method("ACK")) >>>> sl_send_reply("403","Preload Route denied"); >>>> exit; >>>> } >>>> >>>> # record routing >>>> if (!is_method("REGISTER|MESSAGE")) >>>> record_route(); >>>> >>>> # account only INVITEs >>>> if (is_method("INVITE")) { >>>> >>>> setflag(ACC_DO); # do accounting >>>> } >>>> >>>> if (!uri==myself) { >>>> append_hf("P-hint: outbound\r\n"); >>>> route(relay); >>>> } >>>> # requests for my domain >>>> if (is_method("PUBLISH|SUBSCRIBE")) >>>> { >>>> sl_send_reply("503", "Service Unavailable"); >>>> exit; >>>> } >>>> >>>> if (is_method("REGISTER")) >>>> { >>>> setflag(TCP_PERSISTENT); >>>> if (!save("location")) >>>> sl_reply_error(); >>>> >>>> exit; >>>> } >>>> >>>> if ($rU==NULL) { >>>> # request with no Username in RURI >>>> sl_send_reply("484","Address Incomplete"); >>>> exit; >>>> } >>>> # do lookup with method filtering >>>> if (!lookup("location","m")) { >>>> t_newtran(); >>>> t_reply("404", "Not Found"); >>>> exit; >>>> } >>>> >>>> if (isbflagset(NAT)) setflag(NAT); >>>> >>>> # when routing via usrloc, log the missed calls also >>>> setflag(ACC_MISSED); >>>> route(relay); >>>> } >>>> >>>> route[relay] { >>>> # for INVITEs enable some additional helper routes >>>> if (is_method("INVITE")) { >>>> >>>> if (isflagset(NAT)) { >>>> rtpproxy_offer("ro"); >>>> } >>>> >>>> t_on_branch("per_branch_ops"); >>>> t_on_reply("handle_nat"); >>>> t_on_failure("missed_call"); >>>> >>>> } >>>> >>>> if (isflagset(NAT)) { >>>> add_rr_param(";nat=yes"); >>>> } >>>> >>>> if (!t_relay()) { >>>> send_reply("500","Internal Error"); >>>> }; >>>> exit; >>>> } >>>> >>>> branch_route[per_branch_ops] { >>>> xlog("new branch at $ru\n"); >>>> } >>>> >>>> >>>> onreply_route[handle_nat] { >>>> if (nat_uac_test("1")) >>>> fix_nated_contact(); >>>> if ( isflagset(NAT) ) >>>> rtpproxy_answer("ro"); >>>> xlog("incoming reply\n"); >>>> } >>>> >>>> failure_route[missed_call] { >>>> if (t_was_cancelled()) { >>>> exit; >>>> } >>>> >>>> # uncomment the following lines if you want to block client >>>> # redirect based on 3xx replies. >>>> ##if (t_check_status("3[0-9][0-9]")) { >>>> ##t_reply("404","Not found"); >>>> ## exit; >>>> ##} >>>> >>>> } >>>> >>>> >>>> Thank you in advance! >>>> >>>> _______________________________________________ >>>> Users mailing list >>>> [email protected] >>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users >>> >>> >>> _______________________________________________ >>> Users mailing list >>> [email protected] >>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users >> >> _______________________________________________ >> Users mailing list >> [email protected] >> http://lists.opensips.org/cgi-bin/mailman/listinfo/users > > > _______________________________________________ > Users mailing list > [email protected] > http://lists.opensips.org/cgi-bin/mailman/listinfo/users _______________________________________________ Users mailing list [email protected] http://lists.opensips.org/cgi-bin/mailman/listinfo/users
