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.
Posted at Nginx Forum:
Hello!
On Tue, May 03, 2016 at 05:45:05AM -0400, ben5192 wrote:
(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
idea.
–
Maxim D.
http://nginx.org/