[libvirt] [PATCH] get memory in openvz driver

Daniel P. Berrange berrange at redhat.com
Thu Aug 14 11:15:06 UTC 2008


On Wed, Aug 13, 2008 at 12:50:33PM +0400, Evgeniy Sokolov wrote:
> OpenVZ has several parameters for memory management. All of them can be 
> configured independetly.
> 
> Patch allow to get configuration of memory from container config and 
> then calculate total usage of memory.
> 
> It is open question how to manage memory?

Basically the 'memory' as shown by libvirt should correspond to 
the 'Total' seen inside the guest when running 'free'. 

eg

# free
             total       used       free     shared    buffers     cached
Mem:        524288      34676     489612          0          0          0
-/+ buffers/cache:      34676     489612
Swap:            0          0          0

In this case 'memory' is 524288 kb.

This looks to correspond to OpenVZs  'PRIVVMPAGES' pages parameter.

> +openvzFreeUbParam(struct openvz_ub_param *ub)
> +{
> +    if (ub == NULL)
> +        return;
> +#define FREE_P(x) if (ub->x != NULL) VIR_FREE(ub->x);

This is not required.  VIR_FREE is happy to accept a NULL 
and will do nothing. Just call VIR_FREE directly without
testing for != NULL.

> +/* calculate guaranteed memory for container
> +*/
> +int
> +openvzUb2Memory(struct openvz_ub_param *ub, unsigned long *memory)
> +{
> +    unsigned long lowmem, mem, allmem;
> +
> +    if (ub->oomguarpages == NULL ||
> +        ub->kmemsize == NULL ||
> +        ub->tcpsndbuf == NULL ||
> +        ub->tcprcvbuf == NULL ||
> +        ub->othersockbuf == NULL ||
> +        ub->dgramrcvbuf == NULL ||
> +        ub->lockedpages == NULL)
> +        return -1;
> +
> +    lowmem = ub->kmemsize->limit +
> +             ub->tcpsndbuf->limit +
> +             ub->tcprcvbuf->limit +
> +             ub->othersockbuf->limit +
> +             ub->dgramrcvbuf->limit +
> +             ub->lockedpages->limit * get_pagesize();
> +
> +    mem = ub->oomguarpages->barrier * get_pagesize();
> +    allmem = mem + lowmem; //in bytes
> +    *memory = allmem / 1024; //in kb

Summing all the different memory limits together is wrong - this will
make it impossible to implement a 'setMemory' operation because you've
now no way of deciding which parameter to set.

In my testing the total memory inside a OpenVZ container seems to 
correspond to the 'lockedpages' parameter, so we should just return
that value.

Since you convert to 'bytes' before converting back into kb, you'll
potentially overflow a 'long' on 32-bit platforms. You should use
'unsigned long long' instead to be safe.

> +int
> +openvzUb2MaxMemory(struct openvz_ub_param *ub, unsigned long *memory)
> +{
> +    unsigned long lowmem, mem, allmem;
> +
> +    if (ub->privvmpages == NULL ||
> +        ub->kmemsize == NULL ||
> +        ub->tcpsndbuf == NULL ||
> +        ub->tcprcvbuf == NULL ||
> +        ub->othersockbuf == NULL ||
> +        ub->dgramrcvbuf == NULL ||
> +        ub->lockedpages == NULL)
> +        return -1;
> +
> +    lowmem = ub->kmemsize->limit +
> +             ub->tcpsndbuf->limit +
> +             ub->tcprcvbuf->limit +
> +             ub->othersockbuf->limit +
> +             ub->dgramrcvbuf->limit +
> +             ub->lockedpages->limit * get_pagesize();
> +
> +    mem = ub->privvmpages->barrier * get_pagesize();
> +    allmem = mem + lowmem; //in bytes
> +    *memory = allmem / 1024; //in kb

Likewise this should simply use the lockedpages parameter I believe.

What is the difference between a 'barrier' and a 'limit' in openvz
config ?  Would it make sense to map 'memory' to the 'barrier' and
'maxmemory' to the 'limit' ?


>  
> @@ -262,6 +264,10 @@ static int openvzDomainGetInfo(virDomain
>          }
>      }
>  
> +    openvzGetMemory(dom->conn, strtoI(dom->name), &(info->memory)) ;
> +    openvzGetMaxMemory(dom->conn, strtoI(dom->name), &(info->maxMem)) ;

Can't you use  'vm->vpsid' and avoid the strtoI() call ?

It seems it would be more efficient to call openvzReadUbParams()
and openvzUb2Memory() & openvzUb2MaxMemory directly, rather than
calling out to  openvzGetMemory() and openvzGetMaxMemory() since
it would avoid reading the config file twice - you can also get
the nrVirtCPUs at the same time.

Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list