Mladen Turk wrote:
So, it's been proven that the new apr pool
doesn't perform well except on some obscure platforms
with third-party libraries.
Just did some more profiling on the new apr-pool code
inside httpd. I've simply
#undef malloc
#undef calloc
and add size and number of call counters
(some memory profiler would be better, but
this one is good enough for the subject)
The plain httpd -k start of httpd trunk
gives the following results in child_init hook
New apr pool:
APR_POOL STATS -- child init
malloc calls: 14819
free calls : 7451
malloc size : 1327972
free size : 784919
pool create : 148
pool clear : 3
pool destroy: 83
pool size : 4172
palloc calls: 14642
palloc size : 656700
1.4 apr pool:
APR_POOL STATS -- child init
malloc calls: 129
free calls : 0
malloc size : 1101928
pool create : 148
pool clear : 3
pool destroy: 83
sizeof(pool): 64
palloc calls: 14640
palloc size : 698440 - aligned
1.4 apr pool with MIN_ALLOC == 2048
APR_POOL STATS -- child init
malloc calls: 211
free calls : 0
malloc size : 540776
free size : 0
pool create : 148
pool clear : 3
pool destroy: 83
pool size : 64
palloc calls: 14640
palloc size : 698440
This means that average apr_palloc/calloc is 45 bytes
(48 bytes in old apr because of alignment) just to
startup the server. If you involve the request processing
think the average size will be even lower.
So I doubt in any numbers showing the simple
pointer math is slower then a function call
even with tcmalloc, but ... ;)
Finally, what does those numbers mean?
Both implementations suck :)
For an total requested size of 640K we ended
with allocated 1M from the system using 1.4
apr pool.
Interestingly the new implementation is much better
regarding that. After settling it consumes less
memory, but it suffers from peek usage, where
the usage goes much higher until pool get cleared.
However if I change the MIN_ALLOC to 2048 and
adjust the BOUNDARY_INDEX to 10, the total
memory usage lowers to 512K.
Regards
--
^(TM)