[virt-tools-list] Virt Manager CPU usage calculation algorithm

Cole Robinson crobinso at redhat.com
Tue Apr 10 14:02:20 UTC 2012


On 04/09/2012 03:02 PM, Maxim Sditanov wrote:
> Good day
> 
> I implementing in virsh more detailed output for domains
> (https://bugzilla.redhat.com/show_bug.cgi?id=595428).
> And i stuck with CPU usage percentage calculation. How virt manager
> calculate cpu percentage?
> I tried to read virt-manager sources, but it is hard for me to
> understand virt-manager (i am not familiar with python).
> I found function "_sample_cpu_stats" in file src/virtManager/domain.py
> and i think this function make calculations. But i may be wrong
> 
> Please, describe logic, how virt-manager calculate cpu usage
> 

>     def _sample_cpu_stats(self, info, now):

info is the output of dominfo()
now is timestamp of when the info was fetched

>         prevCpuTime = 0
>         prevTimestamp = 0
>         cpuTime = 0
>         cpuTimeAbs = 0

cpuTime is the amount of time the guest has spent scheduled on the host cpus.

>         pcentHostCpu = 0
>         pcentGuestCpu = 0
> 
>         if len(self.record) > 0:
>             prevTimestamp = self.record[0]["timestamp"]
>             prevCpuTime = self.record[0]["cpuTimeAbs"]
> 

We store a bunch of stats history in the list self.record. Get the previous
timestamp and previous cputime

>         if not (info[0] in [libvirt.VIR_DOMAIN_SHUTOFF,
>                             libvirt.VIR_DOMAIN_CRASHED]):
>             guestcpus = info[3]
>             cpuTime = info[4] - prevCpuTime

cpuTime is now the amount of time the guest was scheduled since the last time
we ran dominfo()

>             cpuTimeAbs = info[4]
>             hostcpus = self.conn.host_active_processor_count()
> 
>             pcentbase = (((cpuTime) * 100.0) /
>                          ((now - prevTimestamp) * 1000.0 * 1000.0 * 1000.0))

This is getting the base fraction of how much of the last time period the
guest was running on the CPU. All the multiplication is just getting the
values to be using consistent factors, for example cpuTime is in 10^-9 seconds
it seems.

>             pcentHostCpu = pcentbase / hostcpus
>             pcentGuestCpu = pcentbase / guestcpus
> 

These factor in host and guest cpu counts.

- Cole

>         pcentHostCpu = max(0.0, min(100.0, pcentHostCpu))
>         pcentGuestCpu = max(0.0, min(100.0, pcentGuestCpu))
> 
>         return cpuTime, cpuTimeAbs, pcentHostCpu, pcentGuestCpu






More information about the virt-tools-list mailing list