Just few days after the last major release , new appealing feature was introduced in the development version.
Until now, when dealing with large number of subscribers, old OpenSER required tunings and recompilation to resize the private memory large enough so that all location records from database could be loaded. It was quite annoying because this private memory was used only once, at startup, afterwards most of it was not used at all by the SIP server, but it was allocated and no other application could use it.
The new features loads chunks of records, the size of the chunk being configurable and specific for the available private memory. The issue is now solved in OpenSER, allowing straightforward deployments for carrier grade platforms. This adds more value to the features introduced with the latest release that enabled geographic distribution/failover and load balancing.
For a better understanding of the old issue, below is technical description along with some test results …
OpenSER allocates for each process it starts a chunk of private memory. The default is 1MB. This size is enough for processing a SIP message and all other tasks during run time. To load the location table with hundreds of thousands records, the internals of OpenSER had to be tunned, then the application recompiled and reinstalled. As example, for 120 000 location records, if you run the SIP server with 32 processes and because of location table size, you would have to increase the private memory to 32MB, a total of 1GB would have been allocated just for private memory. But only one process required 32MB, the one which loaded the location table, and only once during OpenSER runtime: at startup.
From the tests, after loading about 4300 user location records, the 1MB private memory was exhausted and the SIP server didn’t start. Using the new OpenSER feature, and the default OpenSER configuration (4 worker processes, each with 1MB of private memory, and 32MB share memory), more than 120 000 user location records were loaded with no hacking. The total system memory used was 39MB (7*1MB private + 32MB share; 7 = 1 main process + 1 FIFO process + 1 timer process + 4 worker processes). The old version required about 256MB (7*32MB private + 32MB share). The memory size would have increased dramatically if you enable TCP/TLS and used more worker processes.
At this moment, only MySQL driver in OpenSER has support for fetch capability. Soon, PostgreSQL and UnixODBC drivers will be updated.