You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by INOUE Seiichiro <in...@ariel-networks.com> on 2005/12/23 19:39:06 UTC

apr_pool memory usage (Re: [Fwd: APR_POOL_DEBUG??])

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.
 * @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 <in...@ariel-networks.com>

Re: apr_pool memory usage (Re: [Fwd: APR_POOL_DEBUG??])

Posted by jacky <nb...@gmail.com>.
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);
		}
	}