Help with shared memory usage

Maxim Dounin mdounin at mdounin.ru
Mon Jul 1 11:36:29 UTC 2013


Hello!

On Fri, Jun 28, 2013 at 10:36:39PM -0300, Wandenberg Peixoto wrote:

> Hi,
> 
> I'm trying to understand how the shared memory pool works inside the Nginx.
> To do that, I made a very small module which create a shared memory zone
> with 2097152 bytes,
> and allocating and freeing blocks of memory, starting from 0 and increasing
> by 1kb until the allocation fails.
> 
> The strange parts to me were:
> - the maximum block I could allocate was 128000 bytes
> - each time the allocation fails, I started again from 0, but the maximum
> allocated block changed with the following profile
> 128000
> 87040
> 70656
> 62464
> 58368
> 54272
> 50176
> 46080
> 41984
> 37888
> 33792
> 29696
> 
> This is the expected behavior?
> Can anyone help me explaining how shared memory works?
> I have another module which do an intensive shared memory usage, and
> understanding this can help me improve it solving some "no memory" messages.
> 
> I put the code in attach.

I've looked into this, and the behaviour is expected as per 
nginx slab allocator code and the way you do allocations in your 
test.

Increasing allocations of large blocks immediately followed by 
freeing them result in free memory blocks split into smaller 
blocks, eventually resulting in at most page size allocations 
being possible.  Take a look at ngx_slab_alloc_pages() and 
ngx_slab_free_pages() for details.

Note that slab allocator nginx uses for allocations in shared 
memory is designed mostly for small allocations.  It works well 
for allocations less than page size, but large allocations support 
is very simple.  Probably it should be improved, but as of now 
nothing in nginx uses large allocations in shared memory.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



More information about the nginx-devel mailing list