Documentation -> TroubleShooting -> Out Of Memory
What to do if "out of memory" or "no more memory" messages are generated by OpenSIPS?
There are two cause that may lead to memory starvation:
a) a small pool of memory - the configured memory is not enough and no more memory can be allocated.
b) memory leak - some memory ids are not properly freed, so they will gradually fill up all available memory (not used, but still allocated)
Determining the cause
If the memory starvation is because of a too small pool of memory, by stopping the traffic on the proxy (without stopping the proxy), the allocated memory will be freed in time (as transactions and location records are freed). TEST: wait ~5 minutes without any kind of load the proxy, so the majority of calls get a chance to close. Test the proxy by placing several calls; if the memory errors pop up again once the traffic is resumed, it means it's a memory leak somewhere; If not sure of the result, consider it's a memory leak.
How to handle it
If the memory pool is too small, you can increase the available pools with the -m (shared mem) and -M (per process mem) parameters of the opensips binary (values are given in MB).
If it is about a memory leak or a memory corruption issue, you need to compile or enable the debug support into the memory manager. To do so, follow the next steps:
1. Enable memory debugging
2. OpenSIPS 2.4 and below: recompile everything
3. set memdump = 1 in your configuration script (to get the memory messages) - it must be lower than debug.
4. restart your proxy
Now, you may check the memory status in two situations:
1. At shutdown - just stop the proxy - the memory manager will dump the memory status. Normally most of the memory is cleaned during shutdown. If there is a memory leak, it should be visible as not-freed memory. A memory status looks like:
0(17665) Memory status (shm): 0(17665) qm_status (0xb5a7e000): 0(17665) heap size= 33554432 0(17665) used= 1592952, used+overhead=1811564, free=31742868 0(17665) max used (+overhead)= 1811564 0(17665) dumping all alloc'ed. fragments: 0(17665) 0. N address=0xb5ab240c frag=0xb5ab23f4 size=4 used=1 0(17665) alloc'd from mem/shm_mem.c: shm_mem_init_mallocs(199) 0(17665) start check=f0f0f0f0, end check= c0c0c0c0, abcdefed 0(17665) 1. N address=0xb5ab2440 frag=0xb5ab2428 size=4 used=1 0(17665) alloc'd from timer.c: init_timer(52) 0(17665) start check=f0f0f0f0, end check= c0c0c0c0, abcdefed
2. At run time
If you have no clue how to interpret the logs for memory status, post it on a FTP or HTTP server and send the link on the firstname.lastname@example.org mailing list.