[asterisk-dev] ODBC improvements: Community opinions requested
Marek Červenka
cervajs at fpf.slu.cz
Wed Dec 2 03:09:25 CST 2015
+1 to unixodbc connection pooling (but i'm not using it in production)
googled for "unixodbc connection pooling issues". few results
Dne 1.12.2015 v 0:14 Mark Michelson napsal(a):
> Hi folks,
>
> I apologize if this ends up being a wall of text
>
> In Asterisk 13, we introduced two new features, the PJSIP channel
> driver and the sorcery configuration management tool, that have both
> made the stability and reliability of Asterisk better. However, when
> it comes to realtime configuration with ODBC, we've noticed that there
> is a bad trend of contention within res_odbc in Asterisk. This is
> because the PJSIP channel driver, unlike chan_sip, is multithreaded,
> meaning that multiple threads may be attempting to read or alter the
> database at the same time. Also, the use of sorcery, along with the
> use of different types of objects within the PJSIP channel driver,
> results in more database queries than were being performed with chan_sip.
>
> Part of this issue has been addressed by adding a memory cache to
> sorcery, and there will be work down the pipe to decrease the number
> of unneeded database queries. In the meantime, though, addressing the
> contention issue is something I want to get fixed.
>
> The big reason for the contention is that a default configuration of
> Asterisk results in a single connection to the database being created
> and shared between all threads. This connection is lock-protected,
> resulting in many threads potentially waiting on the lock in order to
> be able to use the connection. The res_odbc.conf file allows for an
> administrator to configure multiple connections for Asterisk to use,
> but this limitation is incredibly strict. If, for instance, you
> configure Asterisk to use five database connections, all five are in
> use, and a query is initiated, it will fail, rather than doing
> something graceful, like waiting for a connection to become available.
> Predicting the number of connections you'll need is incredibly
> difficult, and so you're likely to end up causing yourself big
> problems unless you set the limit to something absurdly high.
>
> The obvious solution to this problem is to use multiple database
> connections by default in Asterisk. One provision provided by unixODBC
> is a connection pooling option that can be enabled in odbcinst.ini.
> With this, any time that a connection is requested, it is pulled from
> a pool of connections. When disconnected, rather than being freed, the
> connection is added back to the pool. unixODBC has configuration
> options that allow for connections in the pool to eventually time out
> if they haven't been used in a while, and it has an option to allow
> for the connection to only be used a certain number of times before it
> is freed.
>
> The nice thing about this is that the connection pooling logic is
> provided completely under the hood, meaning all Asterisk ever has to
> do is request a connection and then disconnect it. A huge swath of
> code in res_odbc could be outright removed. There are two potential
> problems, though:
>
> * There is no way for us to enforce the use of connection pooling from
> our code. If connection pooling is not configured in odbcinst.ini,
> then Asterisk would end up creating and freeing database connections
> for each query, which could be costly in terms of performance (though
> admittedly it may still be better than the current situation).
> * The amount of data out there about connection pools is pretty
> limited. I had to figure out how it worked and what options were
> available from reading the unixODBC source code. More importantly, I
> don't have much data on the reliability/reputation of unixODBC
> connection pooling.
>
> I'm curious what opinions people have about what would be best for
> Asterisk with regards to using multiple ODBC connections. Do you have
> any experience using unixODBC connection pooling? Was the experience
> positive? Was the performance difference between using connection
> pooling vs. not using connection pooling noticeable?
>
> The alternative to using the connection pooling built into unixODBC
> would be to modify what currently exists in Asterisk to be less
> strict. The goal would be to work similar to how unixODBC works, in
> that multiple connections can be in use, connections can be re-used,
> and the limit on the number of open connections is "softer" than it
> currently is in Asterisk. The big disadvantage to this is having to
> maintain a connection pool within Asterisk instead of letting a lower
> level handle it for us. However, if connection pooling has a
> noticeable performance improvement over constantly opening/closing
> connections, then this may be a tempting alternative since we
> otherwise would not be able to enforce the use of connection pooling
> in unixODBC.
>
> I want to know what community opinion is with regards to how to
> proceed here. Do we write ODBC code in such a way that it has no
> knowledge of connection pooling and *strongly* urge users to enable it
> in odbcinst.ini, or do we modify the existing connection pooling code
> in res_odbc to be more user-friendly?
>
> Thanks in advance,
> Mark Michelson
>
--
---------------------------------------
Marek Cervenka
=======================================
More information about the asterisk-dev
mailing list