[SR-Users] Shared memory fragmentation
Daniel-Constantin Mierla
miconda at gmail.com
Fri Jun 8 14:53:07 CEST 2012
Hello,
On 6/8/12 2:09 PM, Morten Isaksen wrote:
> Hi,
>
> We have 2 Kamailio 3.0.3 servers that has been running with
> carrierroute for about 2 years without any problems. They have 128 MB
> shared memory and
>
> modparam("carrierroute", "config_source", "db")
> modparam("carrierroute", "db_url", "<DBURL>")
> modparam("carrierroute", "fetch_rows", 500)
>
> The carrierroute table is about 91K lines and have been growing slowly.
>
> Suddenly we get this ERROR: carrierroute [cr_data.c:585]: could not
> allocate shared memory from available pool after a few "kamctl cr
> reload".
>
> I increased the shared memory to 256 MB but with the same result. I
> have now increased it to 512 MB and it seems to work better now.
>
> I have noticed this. After a restart the shmem counters is like this:
>
> shmem:total_size = 536870912
> shmem:used_size = 28486752
> shmem:real_used_size = 40147128
> shmem:max_used_size = 41135424
> shmem:free_size = 496723784
> shmem:fragments = 555
>
> And after the first "kamctl cr reload" it is like this:
>
> shmem:total_size = 536870912
> shmem:used_size = 28619016
> shmem:real_used_size = 51842768
> shmem:max_used_size = 76993616
> shmem:free_size = 485028144
> shmem:fragments = 722063
>
>
> Notice the increase in fragments. Sequentials "kamctl cr reload" does
> not change the fragments allot.
>
> Any ideas?
>
be aware that a reload command usually requires at least twice memory
size than the size needed to store the records. That's because the old
structure in memory is kept until the database records are all loaded
and packed in shared memory in a new structure. Then the old and new
structures are swapped for routing usage and the old one is deallocated.
I havent really checked for carrier route module, but it is how happens
with the other modules that do caching (dispatcher, mtree, permissions,
...).
So if you are at the edge of available memory for storing cr rules, then
could happen to get out of memory easy, as shared memory can be used for
other tasks at that time. If number of fragments don't increase even
with 512MB, then this is likely what happens.
Regarding the fragmentation, new release has options for doing
defragmentation automatically:
https://www.kamailio.org/wiki/cookbooks/devel/core#mem_join
The code was actually pretty much all there, so I guess backporting will
not be big task if you want to do it on your local copy.
Also, testing the devel with this feature and giving feedback will be
really appreciated, I had no time to play with it and large number of
records. The feature is off by default, you have to set mem_join=1 in
config to get it on.
Cheers,
Daniel
--
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Kamailio Advanced Training, Seattle, USA, Sep 23-26, 2012 - http://asipto.com/u/katu
Kamailio Practical Workshop, Netherlands, Sep 10-12, 2012 - http://asipto.com/u/kpw
More information about the sr-users
mailing list