
On Thu, May 10, 2007 at 05:41:33PM +0200, Jan Michael wrote:
Hi everyone,
using libvirt I'm trying to calculate cpu utilization of a node in percent. But sometimes values beyond 100.0% are being calculated. This is because a domain spend more time on a cpu than time is elapsed in the meantime.
A short explanation of the way how cpu utilization is computed in my case:
1. - open two connections with conn_cur/conn_old = virConnectOpenReadOnly(NULL); 2. - get current time gettimeofday(&time_old, NULL); - get domain by id with dom_old = virDomainLookupByID(conn_old, id) - get domain information virDomainGetInfo(dom_old, &info_old); 3. - sleep a second
4. - doing same stuff like in 2. but with _cur
5. - compute cpu utilization by dividing used cputime by elapsed time and multiply with 100
Am I right if I suppose that cpuTime for _virDomainInfo structure will be directly acquired from the hypervisor in virDomainGetInfo (dom_old, &info_old) or is it already present with getting the domain itself? Is there any better solution of doing this, which is more precise?
This is the best approach - the algorithm you summarized is basically the same as I use in virt-manager. The reason it sometimes goes above 100% is just due to timing / schedular variations 1. get timeofday 2. get cputime for domA 3. sleep a while 4. get timeofday 5. get cputime for domA We're basically looking at the ratio of 4-1, against 5-2. It would be 100% accurate if you could guarentee no time elapased between steps 1 & 2, or between steps 4 & 5, but there's always some latency in there, so occassionally you might end up calculating a value that is a tiny bit over 100%. In virt-manager I deal with this by simply rounding down to 100 if this occurs. Based on the hypercalls which are available to us, I don't see any way to avoid this scenario. Then again it is not like we really need millisecond precision in caculating CPU usage so I don't think its a problem worrying about too much.
And another general question: The monitoring utility of xen, called xentop, provides also statistics about networking and vbds. Are there any plans to provide this values by libvirt in the future?
I'd like to see the ability to track network & disk I/O stats. No one has so far stepped forward to suggest an API or implmentation, but I'd welcome anyone interested in taking a look at this area. Regards, Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|