[OpenSIPS-Users] Asynchronous DB queries in OpenSIPS 1.x

Vlad Paiu vladpaiu at opensips.org
Wed Mar 16 18:18:18 CET 2011

Hello all,

Problem :
     In the current 1.6.x OpenSIPS design, database queries are one of 
the main performance issues. Running DB queries is blocking, and in case 
the DB back-end is not answering as fast as expected, for reasons like 
high load, table locks etc, the  SIP processing children of OpenSIPS 
remain blocked until they receive a reply from the DB and cannot further 
process SIP traffic.

Solution :
     The current 1.6.x OpenSIPS design does not have an asynchronous 
reactor ( will only be present from 2.x on ) so for queries returning a 
result, like selects, we can not address this problem.

      What we can try to speed up are queries that do not return any 
results, like inserts, updates, deletes.
So far we have identified two potential solutions that would allow 
OpenSIPS not to block on these particular types of queries :

1) Extend the OpenSIPS DB core. Add extra core processes that would only 
handle queries that return no results.
     For example : The accounting module need to insert an entry in the 
DB. The module calls the insert() function. Behind the scene, this 
triggers passing all the arguments to the new core processes, via IPC 
mechanisms. The insert() then exists and the SIP children continues 
execution as if the entry has been inserted in the DB. Meanwhile, the DB 
core processes receive the new parameters, build and send the query, 
blocking if necessary.

     Advantages of this solution         : General solution, works for 
all DB drivers. Transparent for modules.
     Disadvantages of this solution    : Not an easy task. IPC 
communication for all queries.

2) Use the asynchronous functions exported by each particular DB driver.
     For example : The accounting module need to insert an entry in the 
DB. The module calls the insert() function. The particular DB module 
used has been modified to call the asynchronous functions whenever it 
can ( inserts, updates, deletes ). The function exists immediately and 
the actual operation on the DB back-end will be applied in the future.

     Advantages of this solution        : Less code to write, no extra 
overhead for IPC
     Disadvantages of this solution   : Not a general solution. While 
Postgres API fully supports asynchronous queries, Mysql only allows 
regular queries to be run asynchronously out of the box, while prepared 
statements can be ran asynchronously with some quite ugly hacks. Other 
modules that deal with an effective DB backend ( db_berkeley, db_oracle 
) would need extra documentation, and eventually, if they do not support 
asynchronous queries, inserts will block until completed for those 
particular modules.

What solution do you find is more appropriate ? Or if you have better 
solutions, please share them.


Vlad Paiu
OpenSIPS Developer

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20110316/cb9a2862/attachment.htm>

More information about the Users mailing list