[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.5 v2] libxc: don't leak buffer containing the uncompressed PV kernel



On Fri, 2014-11-21 at 15:25 -0500, Gedalya wrote:
> On 11/21/2014 06:12 AM, Ian Campbell wrote:
> > On Fri, 2014-11-21 at 11:03 +0000, Ian Campbell wrote:
> >> http://man7.org/linux/man-pages/man3/mallopt.3.html also talks about
> >> various dynamic thresholds for growing and shrinking the heap. My guess
> >> is that we are bouncing up and down over some threshold with every other
> >> reboot.
> > IOW I'm not overly concerned with this apparent bi-modality, so long as
> > the amount isn't increasing in the long term...
> >
> > I think the original patch should go in.
> >
> > Ian.
> >
> >
> It's an improvement, but consider this:
> Someone has a xen host running wheezy, 40 domu's, with 768MB for dom0, 
> worked fine so far. Tries upgrading to jessie, and lo, each domu process 
> takes up only 588 KB on dom0, great!
> Then a new kernel package is released, all domu's get rebooted once. All 
> host memory is now full. Dude might have had other plans for that 
> memory... This is dead memory so I guess it can be swapped out, not 
> easily a scenario where the server totally crashes, but it's a bit ugly, 
> we're talking about memory usage leaping from 0.6 to 16 MB per domu.

Unfortunately this is down to the behaviour of the libc and not
something which appears to be under application control. 

The following program demonstrates the same behaviour and is certainly
not leaking anything. Notice that at "Freed block at XXXXX. Everything
is now freed, end of day" there is still an anon mapping of that
address. Notice also that the "in use" figures are zero.

If this concerns you then you should probably take a look at mallopt(3)
and/or be talking to the libc folks about it. It's not an xl issue
AFAICT.

Ian.

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <malloc.h>

#define KB 196

int main(int argc, char **argv)
{
        void *p;
        char buf[1000];

        snprintf(buf, 1000, "pmap -x %d", getpid());

        printf("Start of day\n");
        system(buf);
        malloc_stats();

        printf("\n=========================\n\n");

        p = malloc(KB*0x1000);

        printf("allocated %dKB block at %p\n", KB, p);
        system(buf);
        malloc_stats();

        printf("\n=========================\n\n");

        free(p);

        printf("Freed block at %p\n", p);
        system(buf);
        malloc_stats();

        printf("\n=========================\n\n");

        p = malloc(KB*0x1000);

        printf("Allocated another %dKB block at %p\n", KB, p);
        system(buf);
        malloc_stats();

        printf("\n=========================\n\n");

        free(p);

        printf("Freed block at %p. Everything is now freed, end of day\n", p);
        system(buf);
        malloc_stats();

        printf("\n=========================\n\n");

        return 0;

}



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.