Shared Memory Structure?

Maxim Dounin mdounin at
Wed May 4 13:40:48 UTC 2016


On Tue, May 03, 2016 at 05:45:05AM -0400, ben5192 wrote:

> I am storing things in a shared memory zone allocated with
> ngx_shared_memory_add and allocating each slab with ngx_slab_alloc_locked
> (as these items don’t need to be locked particularly). The problem I'm
> having is that I add the shared memory with exactly the amount I need.
> However, the final large thing to be allocated fails, but after this a lot
> more smaller things are also allocated without any problem. There is enough
> space for it but it has a problem with a large chunk when space is getting
> tight.
> Does anyone know why this is or how to fix it? My guess was that nginx
> structures the shared memory in a way that means there is enough memory
> (which I have made sure there is) but it is not continuous.
> Thanks.

Shared memory size as specified in a ngx_shared_memory_add() call is the 
total size of the memory region to be allocated by nginx.  As long 
as you use it with slab allocator - various slab allocator 
structures are allocated in this memory region, starting with 
the ngx_slab_pool_t structure, and followed by multiple 
ngx_slab_page_t structures.

If you want to use shared memory for an allocation with a known 
size, you have to add some memory to account these internal 
structures.  Note that it may be not trivial to calculate how may 
extra memory you'll need - see the slab allocator code for 
details.  Adding at least 8 * ngx_pagesize should be a good 

Maxim Dounin

More information about the nginx mailing list