Hello,

 

I have Kamailio installed as SIP redirect for an SBC to make routing decisions.

 

I’m using SQLOps module with postgresql 11.5 where I have multiple tables containing each around 6M record of routing codes:

Code       options

392342  sup1|sup2|sup3

Where code field is of prefix_range data type and has a gist index.

 

I’m sending traffic of 300 CPS to SBC which is forwarding it to Kamailio, and Kamailio respond with 300 multiple choice with the routing decision.

 

In normal cases, everything is going smoothly where Kamailio repsonds up to 50 ms.

 

But during the process of loading data to the routing tables, Kamailio response to SBC is dramatically delayed , where for some calls it takes up to 7 seconds to respond.

 

Noting that during this process the data are loaded to staging tables and not to live tables used by Kamailio.

 

Kamailio is installed on a VM with 32GB RAM and 16 vcores.

 

Following configuration is used in Kamailio:

fork=yes

children=10

 

following are the customized parameters in postgresql.conf

max_connections = 100

shared_buffers = 8GB

effective_cache_size = 24GB

maintenance_work_mem = 2GB

checkpoint_completion_target = 0.7

wal_buffers = 16MB

default_statistics_target = 100

random_page_cost = 1.1

effective_io_concurrency = 200

work_mem = 5242kB

min_wal_size = 1GB

max_wal_size = 2GB

max_worker_processes = 16

max_parallel_workers_per_gather = 8

max_parallel_workers = 16

 

 

Following is the routing logic I’m using:

 

route{

 

if (is_method("INVITE"))              {     

$var(inc) = $(ct{param.value,tgrp}); 

xlog("L_INFO","CONTACT : $var(inc)" );

xlog("L_INFO","from number : $rU" );

if($var(inc)!=0)

route(customer);

route(block);

 

}

}

 

route[customer]

{

sql_query("cb", "select caid from customeridentification where  trunk='$var(inc)'", "ra");

$var(cid)=$dbr(ra=>[0,0]);

sql_result_free("ra");

xlog("L_INFO","cid: $var(cid) \n");

 

sql_query("cb", "select routetablename from carrieraccount where  caid=$var(cid)", "ra");

$var(tid)=$dbr(ra=>[0,0]);

sql_result_free("ra");

 

 

if($var(cid)!=0)

route(query);

else

route(block);

 

}

 

route[query]

{

 

#sql_query("cb", "select supplierid from route_$var(cid) where  prefix @>'$rU' order by prefix limit 1", "ra");

sql_query("cb", "select get_routing('$var(tid)','$rU')", "ra");

$var(sup)=$dbr(ra=>[0,0]);

sql_result_free("ra");

xlog("L_INFO","supplieris: $var(sup) \n");

#$var(x)=$(var(sup){s.replace,|,}{s.len})/4;

 

$var(a)=$(var(sup){s.len});

$var(z)=$(var(sup){s.replace,|,});

$var(b)=$(var(z){s.len});

$var(suplen)=$var(a) - $var(b);

 

if($var(sup)!=0)

route(send);

else

route(block);

}

route[send]

{

xlog("L_INFO","Inside Send \n");

$var(i)=0;

append_to_reply("Contact:");

while($var(i)<$var(suplen) + 1)

{

$var(s)=$(var(sup){s.select,$var(i),|});

$var(s)=$(var(s){s.select,0,;});

append_to_reply("<sip:$rU;tgrp=$(var(s){s.ltrim})@ xxx.xxx.xxx.xxx:5060;user=phone>");

if($var(i)<$var(suplen)) append_to_reply(",");

$var(i)=$var(i)+1;

}

append_to_reply("\r\n");

sl_send_reply("300","Multiple Choices");

exit;

}

 

route[block]

{

xlog("L_INFO","INSIDE BLOCK" );

append_to_reply("Contact:<sip:$rU;tgrp=999999@xxx.xxx.xxx.xxx:5060;user=phone>\r\n");

sl_send_reply("300","Multiple Choices");

exit;

}

 

How can we enhance the Kamailio response in case of load on the postgresql server.

 

 

Regards,

Ali Taher