[libvirt] [RFC][PATCHv1 2/5] libvirt - new API for getting percpu statistics of VM

KAMEZAWA Hiroyuki kamezawa.hiroyu at jp.fujitsu.com
Tue Apr 19 23:58:58 UTC 2011


On Tue, 19 Apr 2011 12:29:05 +0100
"Daniel P. Berrange" <berrange at redhat.com> wrote:

> On Fri, Apr 15, 2011 at 04:43:03PM +0900, KAMEZAWA Hiroyuki wrote:
> > On Fri, 15 Apr 2011 09:43:15 +0200
> > Matthias Bolte <matthias.bolte at googlemail.com> wrote:
> > 
> > > 2011/4/15 KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>:
> > > Also do you really need the absolute CPU time? 
> > yes, for virt-top -1.
> 
> I don't think that is correct. What virt-top ultimately displays
> to the end user is a % utilization. So it would be happy to get
> data in either % util & display that directly, or get absolute
> CPU time and calculate deltas to display % util.
> 

virt-top calculate delta by itself.


> I wonder if we could provide an API that could be used to provide
> either per-VCPU or per-PCPU  statistics in one go, so that we
> can finally have an API for cpu time that works well for VMWare.
> 

VMWare ?

> eg
> 
>     typedef struct _virDomainCPUTime virDomainCPUTime;
>     typedef virDomainCPUTime *virDomainCPUTimePtr;
> 
>     #define VIR_DOMAIN_CPUTIME_ABS "abs"
>     #define VIR_DOMAIN_CPUTIME_UTIL "util"
>     ...define more stats later if desired...
> 

To calculate 'util', we need 'interval' for calculating it.
What interval do we use ? The libvirt need to calculate it periodically
by making a thread ?

"util" can be very easily calculated by

util = cpuTime-delta / (interval(sec) * 1000000000) * 100.

So, it depens on interval. For example, when we make fair-share-scheduler's
balancing interval to 1sec, we never want interaval smaller than 1 sec.

IIUC, virt-top users can specify 'interval'. So, virt-top needs to
use absolute cpuTime delta even if libvirt provides 'util'. Because to show
what users want, virt-top needs to use interval users want.



>     struct _virDomainCPUTime {
>          char field[VIR_DOMAIN_CPU_TIME_FIELD_LENGTH];
>          unsigned long long value;
>     };
> 
>     typedef enum {
>        VIR_DOMAIN_CPU_TIME_VIRTUAL  = 0,
>        VIR_DOMAIN_CPU_TIME_PHYSICAL = 1,
>     } virDomainCPUTimeFlags;
> 
>     int virDomainGetCPUTime(virDomainPtr dom,
>                             virDomainCPUTimePtr stats,
>                             int *nstats,
>                             unsigned int flags);
> 
> 
> When querying per-virtual CPU time,  nstats would be the number of
> virtual CPUs in the guest. eg
> 

Why we take care of vcpus ?


>     virDomainInfo info;
>     virDomainGetInfo(dom, &info);
>     virDomainCPUTimePtr stats;
> 
>     stats = malloc(sizeof(*stats)*info.nrVirtCPU);
> 
>     virDomainGetCPUTime(dom, stats, info.nrVirtCPU,
>                         VIR_DOMAIN_CPU_TIME_VIRTUAL);
> 
> 
> 
> Or to get the break down per physical CPU, use the VIR_NODEINFO_MAX_CPUS
> macro
> 

per vcpu pcpu time is not what I want. Hmm, others needs such information ?
And virt-top need to re-calculate per-vm pcpu time by making sum of cputime per
vcpu on pcus ? Anyway, cpuacct cgroup/ Linux kernel cannot provide per-vcpu-per-pcpu
time and I cannot implement qemu driver.

Thanks,
-Kame



 




More information about the libvir-list mailing list