[SR-Users] problem with dispatcher load balancing

Daniel-Constantin Mierla miconda at gmail.com
Fri Jun 12 07:34:45 CEST 2015


Yes, 4.3 should have all fixes in 4.2.

Cheers,
Daniel

On 12/06/15 06:06, Ding Ma wrote:
> OK, we’ll try to update and report back. Wonder if the latest 4.3 has
> all the fixes went into the latest 4.2.x. We already have plan to
> upgrade to 4.3. 
> Thanks. 
>
>> On Jun 10, 2015, at 10:01 AM, Daniel-Constantin Mierla
>> <miconda at gmail.com <mailto:miconda at gmail.com>> wrote:
>>
>> It was a fix for maxload during 4.2.x, but don't recall exactly when
>> was backported. Can you upgrade to latest 4.2.x and see the results?
>> Your config file and database don't require any change, only deploy
>> the binaries for latest 4.2.x and restart.
>>
>> If the issue is still there with latest 4.2.x, report here and I will
>> look at it with the first chance.
>>
>> Cheers,
>> Daniel
>>
>> On 10/06/15 16:50, Ding Ma wrote:
>>> We're running kamailio 4.2.3. Are there any changes to dispatcher in
>>> 4.2.x?
>>> Thanks,
>>>
>>> # kamailio -V
>>> version: kamailio 4.2.3 (x86_64/linux) 5596bd
>>> flags: STATS: Off, USE_TCP, USE_TLS, TLS_HOOKS, USE_RAW_SOCKS,
>>> DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MEM, SHM_MMAP,
>>> PKG_MALLOC, F_MALLOC, DBG_F_MALLOC, USE_FUTEX,
>>> FAST_LOCK-ADAPTIVE_WAIT, USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR,
>>> USE_DST_BLACKLIST, HAVE_RESOLV_RES
>>> ADAPTIVE_WAIT_LOOPS=1024, MAX_RECV_BUFFER_SIZE 262144, MAX_LISTEN
>>> 16, MAX_URI_SIZE 1024, BUF_SIZE 65535, DEFAULT PKG_SIZE 8MB
>>> poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
>>> id: 5596bd
>>> compiled on 09:32:37 May  6 2015 with gcc 4.4.7
>>>
>>>
>>> On Wed, Jun 10, 2015 at 7:01 AM, Daniel-Constantin Mierla
>>> <miconda at gmail.com <mailto:miconda at gmail.com>> wrote:
>>>
>>>     Hello,
>>>
>>>     what version of kamailio are you using?
>>>
>>>     Cheers,
>>>     Daniel
>>>
>>>
>>>     On 09/06/15 20:51, Ding Ma wrote:
>>>>     I'm trying to set up kamailio dispatcher to distribute calls to
>>>>     2 asterisk servers. So far, the failover case seems ok, but I
>>>>     cannot get the dispatcher to distribute load. All calls are
>>>>     going to the last destination entry in the dispatcher table
>>>>     even if I have set the maxload attributes. I'm using algorithm
>>>>     10 for load distribution. The number of calls sent to one
>>>>     asterisk is well above the maxload. Hope someone more
>>>>     experienced in dispatcher can review my config and give me some
>>>>     recommendations. Thanks in advance.
>>>>
>>>>     Here is the content of dispatcher table in postgresql db.
>>>>
>>>>     select * from dispatcher;
>>>>      id | setid |    destination     | flags | priority |          
>>>>     attrs           | description
>>>>     ----+-------+--------------------+-------+----------+---------------------------+-------------
>>>>       1 |     1 | sip:10.0.1.31:5061 <http://10.0.1.31:5061/> |    
>>>>     0 |        0 | duid=asterisk1;maxload=25 | Asterisk1
>>>>       2 |     1 | sip:10.0.1.33:5061 <http://10.0.1.33:5061/> |    
>>>>     0 |        0 | duid=asterisk2;maxload=25 | Asterisk2
>>>>     (2 rows)
>>>>
>>>>     Here are the dispatcher sections in kamailio.cfg.
>>>>     # ----- dispatcher params -----
>>>>     #!ifdef WITH_DISPATCHER
>>>>     modparam("dispatcher", "db_url", DBASTURL)
>>>>     modparam("dispatcher", "table_name", "dispatcher")
>>>>     modparam("dispatcher", "force_dst", 1). 
>>>>     # If flag 2 is set, then failover support is enabled.
>>>>     modparam("dispatcher", "flags", 3)
>>>>     # the last address in destination set is used as a final option
>>>>     to send the request to
>>>>     modparam("dispatcher", "use_default", 1)
>>>>     # load balancing fail over
>>>>     modparam("dispatcher", "dst_avp", "$avp(dsdst)")
>>>>     modparam("dispatcher", "grp_avp", "$avp(dsgrp)")
>>>>     modparam("dispatcher", "cnt_avp", "$avp(dscnt)")
>>>>     modparam("dispatcher", "dstid_avp", "$avp(dsdstid)")
>>>>     modparam("dispatcher", "attrs_avp", "$avp(dsattrs)")
>>>>     # PVs for hashing
>>>>     modparam("dispatcher", "hash_pvar", "$fU@$ci")
>>>>     # PVs to store results when calling ds_is_from_list
>>>>     modparam("dispatcher", "setid_pvname", "$var(setid)")
>>>>     modparam("dispatcher", "attrs_pvname", "$var(attrs)")
>>>>     # method to probe the gateways
>>>>     modparam("dispatcher", "ds_ping_method", "OPTIONS")
>>>>     modparam("dispatcher", "ds_ping_from", "sip:dispatcher at localhost")
>>>>     modparam("dispatcher", "ds_ping_interval", 30)
>>>>     modparam("dispatcher", "ds_probing_threshhold", 10)
>>>>     modparam("dispatcher", "ds_ping_reply_codes",
>>>>     "class=2;code=403;code=404;code=484;code=488;class=3")
>>>>     modparam("dispatcher", "ds_probing_mode", 1)
>>>>     # size of hash table storing data for call load dispatching,
>>>>     power of two
>>>>     modparam("dispatcher", "ds_hash_size", 10)
>>>>     # expiration time in seconds to remove the load on a
>>>>     destination if no BYE was received
>>>>     modparam("dispatcher", "ds_hash_expire", 3600)
>>>>     # expiration time in seconds to remove the load on a
>>>>     destination if no 200 OK for INVITE was received
>>>>     # and state updated with ds_load_update
>>>>     modparam("dispatcher", "ds_hash_initexpire", 60)
>>>>     modparam("dispatcher", "ds_hash_check_interval", 30)
>>>>     #!endif
>>>>
>>>>     route[WITHINDLG] {
>>>>     if (has_totag()) {
>>>>     # sequential request withing a dialog should
>>>>     # take the path determined by record-routing
>>>>
>>>>     #!ifdef WITH_DISPATCHER
>>>>     if(is_method("BYE|CANCEL") && ds_is_from_list("1", "3"))
>>>>     ds_load_update();
>>>>     #!endif
>>>>     ......
>>>>            }
>>>>     }
>>>>
>>>>     route[FROMASTERISK] {
>>>>     #!ifdef WITH_DISPATCHER
>>>>     if(ds_is_from_list("1", "3")) {
>>>>     xlog("L_DBG","$rm from $fU@$si:$sp: Call from Asterisk cluster\n");
>>>>     return 1;
>>>>     }
>>>>     return -1;
>>>>     #!else
>>>>     if ($si==$sel(cfg_get.asterisk.bindip)) {
>>>>     return 1;
>>>>     }
>>>>     return -1;
>>>>     #!endif
>>>>     }
>>>>
>>>>     onreply_route[MANAGE_REPLY] {
>>>>     xdbg("incoming reply\n");
>>>>     #!ifdef WITH_DISPATCHER
>>>>     if(is_method("INVITE") && ds_is_from_list("1", "3")) {
>>>>     if(status=~"2[0-9][0-9]") {
>>>>     ds_load_update();
>>>>     }
>>>>     else if(status=~"[3-7][0-9][0-9]") {
>>>>     ds_load_unset();
>>>>     }
>>>>     }
>>>>     #!endif
>>>>     if(status=~"[12][0-9][0-9]")
>>>>     route(NATMANAGE);
>>>>     }
>>>>
>>>>     #!ifdef WITH_DISPATCHER
>>>>     failure_route[RTF_DISPATCH] {
>>>>     if (t_is_canceled()) {
>>>>     exit;
>>>>     }
>>>>     # next DST - only for 500 or local timeout
>>>>     if (t_check_status("500") or (t_branch_timeout() and
>>>>     !t_branch_replied())) {
>>>>                     # mark the destination Inactive and Probing
>>>>     ds_mark_dst("IP");
>>>>                     # select the new destination
>>>>     if(ds_next_dst()) {
>>>>     t_on_failure("RTF_DISPATCH");
>>>>     route(RELAY);
>>>>     exit;
>>>>     }
>>>>                     else {
>>>>                             # last available node failed to reply,
>>>>     no other destinations available
>>>>                             send_reply("404", "No destination");
>>>>                             exit;
>>>>                     }
>>>>     }
>>>>     }
>>>>     #!endif
>>>>
>>>>     route[TOASTERISK] {
>>>>     #!ifdef WITH_DISPATCHER
>>>>     # ds_mark_dst("IP");
>>>>     # Call load distribution
>>>>     if(!ds_select_dst("1", "10")) {
>>>>     sl_send_reply("500", "Service Unavailable");
>>>>     xlog("L_INFO","$rm from $fU@$si:$sp: No destinations available
>>>>     for $rd\n");
>>>>                     exit;
>>>>             }
>>>>     xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");
>>>>     t_on_failure("RTF_DISPATCH");
>>>>     #!else
>>>>
>>>>        $du = "sip:" + $sel(cfg_get.asterisk.bindip) + ":"
>>>>     + $sel(cfg_get.asterisk.bindport);
>>>>     #!endif
>>>>     route(RELAY);
>>>>     exit;
>>>>     }
>>>>
>>>>
>>>>     # Dispatcher detects a destination goes down
>>>>     event_route[dispatcher:dst-down] {
>>>>         xlog("L_ERR", "Destination down: $rm $ru ($du)\n");
>>>>     }
>>>>
>>>>     # Dispatcher detects a destination comes up 
>>>>     event_route[dispatcher:dst-up] {
>>>>         xlog("L_ERR", "Destination up: $rm $ru\n");
>>>>     }
>>>>
>>>>
>>>>     _______________________________________________
>>>>     SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>>>     sr-users at lists.sip-router.org <mailto:sr-users at lists.sip-router.org>
>>>>     http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>     -- 
>>>     Daniel-Constantin Mierla
>>>     http://twitter.com/#!/miconda <http://twitter.com/#%21/miconda> - http://www.linkedin.com/in/miconda
>>>     Book: SIP Routing With Kamailio - http://www.asipto.com <http://www.asipto.com/>
>>>
>>>
>>>     _______________________________________________
>>>     SIP Express Router (SER) and Kamailio (OpenSER) - sr-users
>>>     mailing list
>>>     sr-users at lists.sip-router.org <mailto:sr-users at lists.sip-router.org>
>>>     http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>
>> -- 
>> Daniel-Constantin Mierla
>> http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
>> Book: SIP Routing With Kamailio - http://www.asipto.com
>

-- 
Daniel-Constantin Mierla
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Book: SIP Routing With Kamailio - http://www.asipto.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20150612/b569b9c5/attachment.html>


More information about the sr-users mailing list