[libvirt] RFC: APIs for managing resource groups

Daniel P. Berrange berrange at redhat.com
Mon Feb 25 12:41:06 UTC 2013


Historically for the QEMU/LXC drivers we've simply put each virtual
instance in a dedicated cgroup, under the path

  $LIBVIRT_CGROUP_LOCATION
    |
    +- libvirt
         |
         +- qemu
         |   |
         |   +- vm1
         |   +- vm2
         |   +- vm3
         |
         +- lxc
             |
             +- cont1
             +- cont2
             +- cont3

for a variety of reasons this nesting sucks. It is too deep causing
kernel performance problems, its structure does not easily allow for
calculating fixed % shares, it does not allow for grouping of VMs.

We need to simplify our layout and also introduce some APIs for the
grouping of VMs. I won't go into specifics of a new cgroups layout
here, just focus on the question of defining a set of APIs that are
generic to any hypervisor, for the purpose of setting up VM resource
groups.

I'm calling the resource cgroup a "partition", since this is all about
partitioning workloads.

I anticipate a new top level object and APIs for creating/defining it
in the usual manner:


typedef struct _virPartition virPartition;
typedef virPartition *virPartitionPtr;

int virConnectListAllPartitions(virConnectPtr conn,
                                virPartitionPtr **partitions,
                                unsigned int flags);

virPartitionPtr virPartitionDefineXML(virConnectPtr conn,
                                      const char *xml,
                                      unsigned int flags);

int virPartitionCreate(virPartitionPtr partition,
                       unsigned int flags);

int virPartitionCreateXML(virPartitionPtr partition,
                          const char *xml,
                          unsigned int flags);

int virPartitionDestroy(virPartitionPtr partition,
                        unsigned int flags);

int virPartitionUndefine(virPartitionPtr partition,
                         unsigned int flags);



Then I think we'll duplicate all the APIs for setting resource tunables
from virDomainPtr against the new object, so we get


int virPartitionGetSchedulerParameters(virPartitionPtr partition,
                                       virTypedParameterPtr params,
                                       int *nparams,
                                       unsigned int flags);

int virPartitionSetSchedulerParameters(virPartitionPtr partition,
                                       virTypedParameterPtr params,
                                       int nparams,
                                       unsigned int flags)

int virDomainSetBlkioParameters(virDomainPtr domain,
                                virTypedParameterPtr params,
                                int nparams,
                                unsigned int flags);

int virDomainGetBlkioParameters(virDomainPtr domain,
                                virTypedParameterPtr params,
                                int *nparams,
                                unsigned int flags);

int virDomainSetMemoryParameters(virDomainPtr domain,
                                 virTypedParameterPtr params,
                                 int nparams,
                                 unsigned int flags);
int virDomainGetMemoryParameters(virDomainPtr domain,
                                 virTypedParameterPtr params,
                                 int *nparams,
                                 unsigned int flags);
int virDomainSetNumaParameters(virDomainPtr domain,
                               virTypedParameterPtr params,
                               int nparams,
                               unsigned int flags);
int virDomainGetNumaParameters(virDomainPtr domain,
                               virTypedParameterPtr params,
                               int *nparams,
                               unsigned int flags);



Finally we need a way to associate a domain with a partition


virPartitionPtr virDomainGetPartition(virDomainPtr dom,
                                      unsigned int flags);

void virDomainSetPartition(virDomainPtr dom,
                           unsigned int flags);


There'd also likely be a new VM XML element

   <partition name="..partition name..."/>

which is what the Get/SetPartition methods would be touching.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list