Memory Pool

Nginx when it accepts a connection, it creates a memory pool for that
connection (allocating from heap). After which further memory
requirement
for that connection will be allocated from that pool. This is good.
But, why don’t we pre create the memory pools depending upon the number
of
connections and use that pool. In the current approach if some
connections
are coming up going down., we will be allocating and freeing to heap
frequently.

Can someone please clarify why this has been done like this?

Posted at Nginx Forum:

Also I noticed that initially for a connection, it allocates a pool of
size
256 and if that exceeds, it goes and calls ngx_palloc_large which in
turn
calls malloc.

So, can we not allocate more in the first attempt.

Posted at Nginx Forum:

On Wednesday 09 April 2014 04:55:42 nginxsantos wrote:

Nginx when it accepts a connection, it creates a memory pool for that
connection (allocating from heap). After which further memory requirement
for that connection will be allocated from that pool. This is good.
But, why don’t we pre create the memory pools depending upon the number of
connections and use that pool. In the current approach if some connections
are coming up going down., we will be allocating and freeing to heap
frequently.

Can someone please clarify why this has been done like this?

System allocators are usually smart enough to not transform every
malloc()
into syscall.

One of the main benefits provided by these pools is convenient memory
management for C program that allows to not care much about
corresponding
free() calls and memory leaks.

So usually every pool is attached to some object with a clear life
cycle,
like a request or a connection.

wbr, Valentin V. Bartenev

Thank you for the reply.

I know it is simple. But, will we not get more performance benefit if we
create the pools before hand. Say I will create a memory pool for the
connections (for example say with 4000 entries). Everytime I need one, I
will go and get it from that pool and when I free it, I will free that
to
the pool. Will not that be more efficient rather than for every
connection
and request going and allocating a pool.

I always feel the run time malloc calls are bad and for every connection
and
request are expensive when we handle thousands of connections per
seconds.

Please share your thoughts…

Thank you.
Santos

Posted at Nginx Forum:

On Wednesday 09 April 2014 08:22:10 nginxsantos wrote:

request are expensive when we handle thousands of connections per seconds.

Please share your thoughts…

I think performance benefits will be negligible. There are lightweight
web
servers like Lighttpd that doesn’t use memory pools and known to be
pretty
fast.

Also note, that allocation of connection pool is just a one small
allocation,
that nginx does during request processing among number of allocations of
various buffers.

wbr, Valentin V. Bartenev