INOUE Seiichiro <inoue <at> ariel-networks.com> writes: > > Hi, > > > Checking my module with a stress test (1440 reqs/min) I'm observing , > > with top, that SIZE and RSS of httpd processes are growing. > > I recommend you to check apr_allocator_max_free_set(). > > The following sample code shows the effect. > Without calling apr_allocator_max_free_set(), you can find the memory usage is growing rapidly. > > ///////////////// sample code starts > /* memory pool leak test. > * <at> remark No error checks */ > #include <stdio.h> > #include <apr_general.h> > > int main(int argc, char **argv) > { > apr_pool_t *mp; > int i; > > apr_initialize(); > apr_pool_create(&mp, NULL); > > /* XXX Without this setting, memory usage is growing more than expected */ > #define MY_POOL_MAX_FREE_SIZE 32 > { > apr_allocator_t *pa = apr_pool_allocator_get(mp); > if (pa) { > apr_allocator_max_free_set(pa, MY_POOL_MAX_FREE_SIZE); > } > } > > #define BASE_ALLOC_SIZE (8*1024) > i = 0; > while (1) { > apr_palloc(mp, BASE_ALLOC_SIZE + i); > i++; > if (i % 10000 == 0) { > puts("press enter key (please check memory usage)"); > getchar(); > } > apr_pool_clear(mp); > } > apr_terminate(); > return 0; > } > ///////////////// sample code ends > > - INOUE Seiichiro <inoue <at> ariel-networks.com> > > there would be memory leak, it seems that there is no-effect by calling apr_allocator_max_free_set.
#define SIZE (10*1024*1024) apr_pool_t *p; apr_initialize(); atexit(apr_terminate); apr_allocator_t *my_allocator_ptr = NULL; apr_pool_t *system_pool = NULL; if( apr_allocator_create(&my_allocator_ptr) == APR_SUCCESS ){ printf("created my_allocator_ptr success\n"); apr_allocator_max_free_set(my_allocator_ptr, SIZE); printf("set max free size for my_allocator_ptr to %d\n", SIZE); } apr_pool_create(&system_pool, NULL); apr_pool_create_ex(&p, system_pool, (apr_abortfunc_t) failed_to_allocate, my_allocator_ptr); apr_allocator_owner_set(my_allocator_ptr, p); apr_allocator_t *pa = apr_pool_allocator_get(p); printf("pa %x my_allocator_ptr %x\n\n", pa, my_allocator_ptr); int chunk_size; void *ptr = NULL; chunk_size = 1024*1024; ptr = apr_pcalloc(p, chunk_size); for(int i = 1; ptr != NULL; i++){ ptr = apr_pcalloc(p, chunk_size); if( ptr != NULL ){ printf("pass %3.3d: allocated %d bytes\n", i, chunk_size); } else{ printf("pass %3.3d: ***failed to allocate %d bytes\n", i, chunk_size); } }