<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250"><title>Re: [OpenSIPS-Users] number of opensips children</title>
</head>
<body>
<font face="Tahoma, Verdana, Helvetica, Arial"><span style="font-size:10pt">Stanisław,<br>
<br>
This is absolutely fantastic information!! &nbsp;A bit more details about my implementation, if for no other purpose than to illustrate to myself I’m not completely insane... &nbsp;All the DB operations involved in routing a call (usrloc, auth, least-cost routing, etc) take place in a mysql cluster. &nbsp;No DB problems here I can detect. &nbsp;All the write-heavy operations (siptrace, acc via FreeRadius) go to a master half of a master/slave configuration. &nbsp;All tables are InnoDB — the server has experienced some attempts at InnoDB optimization. &nbsp;I took a look at the MySQL 5.1 Sys Variable page for a better understanding of the key cache setting. &nbsp;It looks like the “key_buffer_size” variable is for MyISAM only. &nbsp;I think the InnoDB equivalent is innodb_buffer_pool_size. &nbsp;I’ve got it set to 2G. &nbsp;I’m still learning how to read the server stats to determine if that’s enough. <br>
<br>
The Opensips side consists of three proxies for a total of about 100 children (not 150, my mistake). &nbsp;The proxies have different uses so an average call touches only two of the three. &nbsp;And no, not for a city of any size. &nbsp;Ha! &nbsp;Each proxy lives in its own Xen paravirtualized guest on the same 8-core host. &nbsp;The load average of any of them rarely exceeds 0.01, so no issue there. &nbsp;Each VM also contains its own mysqld cluster front-end, and its own instance of FreeRadius for accounting. &nbsp;I’ve got another 176 DB connections to that master mysql box from all the FreeRadius processes. &nbsp;Not sure why; that seems high even to me. &nbsp;My goal there was to have on DB connection per Opensips process. &nbsp;Anyway, the master machine does report near 300 concurrent connections. &nbsp;All that machine does is write and update InnoDB tables, and replicate to the slave.<br>
<br>
So one process can handle the processing of one message at a time. &nbsp;The process will not clear (accept another message) until all operations are completed, including routing out a network interface, finishing any module’s db writes, etc. &nbsp;Sounds simple enough. &nbsp;I’ll look into the benchmark module to get some numbers on my particular config on each of the proxies. &nbsp;I’m thinking network captures would provide a good indicator as well, by comparing the arrival and departure times of the request? &nbsp;I am running 1.5 and 1.6. &nbsp;All prepared statements I believe. &nbsp;Good times here.<br>
<br>
Unfortunately my napkin ran out of batteries so I had to fire up the Gnome Calculator. &nbsp;Once I get some measurements from either the benchmark module or from tshark I’ll see what it can crunch for me.<br>
<br>
Hopefully others will find this thread useful in the planning of their own systems. &nbsp;Or, as in my case, unveil the gross mis-planning.<br>
<br>
<br>
- Jeff<br>
<br>
<br>
<br>
On 12/14/09 6:13 PM, &quot;Stanisław Pitucha&quot; &lt;<a href="viraptor@gmail.com">viraptor@gmail.com</a>&gt; wrote:<br>
<br>
<font color="#0000FF">&gt; 2009/12/14 Jeff Pyle &lt;<a href="jpyle@fidelityvoice.com">jpyle@fidelityvoice.com</a>&gt;:
&gt; I'm trying to determine the <br>
&gt; &quot;proper&quot; number of opensips children for my
&gt; setup.

Unless you supply <br>
&gt; telephony to everyone in a small city, it will be below 32 ;)

&gt; I'm having <br>
&gt; trouble understanding which operations effectively block
&gt; or occupy a process <br>
&gt; until completion, and which ones allow a process to
&gt; handle other <br>
&gt; traffic.

All operations &quot;block&quot;. When a packet comes in, one process will <br>
&gt; get
it and will do nothing else, apart from running the config, with <br>
&gt; this
particular message as the context. That means, if you're running a <br>
&gt; db
query, the process owning the packet will sleep and do nothing.

&gt; My <br>
&gt; theory thus far has been to run more children than I should ever need so
&gt; <br>
&gt; then I don't have to worry about any blocking. &nbsp;But 150&#43; children later
&gt; <br>
&gt; across three proxies and I'm afraid my DB server is unhappy with so many
&gt; <br>
&gt; connections from FreeRadius and Opensips.

150 * 3 connections to the db? If <br>
&gt; it's mysql, then yes - it's very
unhappy. mysqltuner.pl will probably show you <br>
&gt; that the maximal memory
usage is way over your RAM size ;) Assuming you have <br>
&gt; max connections &gt;
450 and large key buffers - but then, if you don't have big <br>
&gt; enough key
caches, that's the first spot for optimisation.

&gt; Is it <br>
&gt; message-based? &nbsp;That is, does a child process a single message until
&gt; it <br>
&gt; ships out with t_relay or similar? &nbsp;In this case, how do things like
&gt; <br>
&gt; siptrace or accounting impact a child's ability to process other <br>
&gt; messages?

This. But I'm not sure what siptrace / acc effect are you <br>
&gt; talking
about. If you need to log the message, it will block the process <br>
&gt; -
that's pretty much it.

Anyways - my recommendation would be to:
1. Have a <br>
&gt; look at the benchmark module. Measure your standard messages
processing time <br>
&gt; (INVITE and REGISTER will be the longest)
2. If you're using mysql, but not <br>
&gt; the newest opensips - go grab it now
and experience the prepared statements <br>
&gt; boost :)
3. Calculate how many messages do you *really* need / want to push <br>
&gt; in
a normal and peek time.

For example, lets say that you use only invites <br>
&gt; (no registration) -
and can process a request in 200ms and a response in 50ms. <br>
&gt; (that's
probably somewhere between 10 and 100 times the real amount of <br>
&gt; time
needed, depending on your database usage) For a normal call you <br>
&gt; need
INVITE, 407, INVITE, 180, 200, ACK, BYE, 200 -- around 1s in total.
That <br>
&gt; means with 150 processes you can push complete 150 calls per
second (with <br>
&gt; authorisation and hangup). With a typical call taking
~4min, you will <br>
&gt; theoretically support 60*4*150 ==... 36 thousands open
calls. Theoretically, <br>
&gt; because your CPU probably won't be able to
handle 150 power-hungry processes <br>
&gt; at the same time.

In reality, with only the dialog database, or by using some <br>
&gt; custom
in-memory storage, you'll get an average processing time of 1ms <br>
&gt; /
request. And with any storage, the database should die, before
opensips even <br>
&gt; notices there is any serious work to do...

These are of course back of a <br>
&gt; napkin type calculations and don't take
them too seriously, but you'll find <br>
&gt; out that 150 is way too much.
Measure your processing time, measure your sip <br>
&gt; packets per second on
the interface... check how many processes do you need in <br>
&gt; your worst
time of the day.

-- 
KTHXBYE,

Stanisław Pitucha, Gradwell Voip <br>
&gt; Engineer

_______________________________________________
Users mailing <br>
&gt; list
<a href="Users@lists.opensips.org">Users@lists.opensips.org</a>
<a href="http://lists.opensips.org/cgi-bin/mailman/listin">http://lists.opensips.org/cgi-bin/mailman/listin</a><br>
&gt; fo/users
<br>
</font></span></font>
</body>
</html>