On Fri, Apr 08, 2011 at 08:36:52PM +0900, Minoru Usui wrote: > virNodeGetCPUTime: Implement virsh support > > Add nodecputime subcommand to virsh. > This subcommand prints below output. > > [Linux] > # build/tools/virsh nodecputime > usage: 2.8% > user : 0.8% > system: 1.9% > idle : 97.2% > iowait: 0.0% > > [can get cpu utilization directly(ESX?)] > # build/tools/virsh nodecputime > usage: 2.8% > > Signed-off-by: Minoru Usui <usui@xxxxxxxxxxxxxxxxx> > --- > tools/virsh.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > tools/virsh.pod | 4 ++ > 2 files changed, 100 insertions(+), 0 deletions(-) > > diff --git a/tools/virsh.c b/tools/virsh.c > index 19e3449..93288ba 100644 > --- a/tools/virsh.c > +++ b/tools/virsh.c > @@ -3388,6 +3388,101 @@ cmdNodeinfo(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) > } > > /* > + * "nodecputime" command > + */ > +static const vshCmdInfo info_nodecputime[] = { > + {"help", N_("Prints cpu utilizatoin of the node.")}, > + {"desc", N_("Returns cpu utilizatoin of the node.(%)")}, > + {NULL, NULL} > +}; > + > +static int > +cmdNodeCpuTime(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) > +{ > + int i, j; > + int flag_utilization = FALSE; > + virNodeCpuTime stats[VIR_NODE_CPU_TIME_NR]; > + int nr_stats; > + struct cpu_time { > + unsigned long long user; > + unsigned long long sys; > + unsigned long long idle; > + unsigned long long iowait; > + unsigned long long util; > + } cpu_time[2]; > + double user_time, sys_time, idle_time, iowait_time, total_time; > + double usage; > + > + if (!vshConnectionUsability(ctl, ctl->conn)) > + return FALSE; > + > + memset(cpu_time, 0, sizeof(struct cpu_time) * 2); > + > + for (i = 0; i < 2; i++) { > + memset(stats, 0, sizeof(virNodeCpuTime) * VIR_NODE_CPU_TIME_NR); > + nr_stats = virNodeGetCpuTime(ctl->conn, &stats[0], > + VIR_NODE_CPU_TIME_NR, 0); > + if (nr_stats < 0) { > + vshError(ctl, "%s", _("failed to get cpu time of the node.")); > + return FALSE; > + } > + > + for (j = 0; j < nr_stats; j++) { > + switch (stats[j].tag) { > + case VIR_NODE_CPU_TIME_KERNEL: > + cpu_time[i].sys = stats[j].val; > + break; > + case VIR_NODE_CPU_TIME_USER: > + cpu_time[i].user = stats[j].val; > + break; > + case VIR_NODE_CPU_TIME_IDLE: > + cpu_time[i].idle = stats[j].val; > + break; > + case VIR_NODE_CPU_TIME_IOWAIT: > + cpu_time[i].iowait = stats[j].val; > + break; > + case VIR_NODE_CPU_TIME_UTILIZATION: > + flag_utilization = TRUE; > + cpu_time[i].util = stats[j].val; > + break; > + case VIR_NODE_CPU_TIME_NR: > + default: > + break; > + } > + } > + > + sleep(1); > + } I'm not sure about this bit. In other places in virsh, we just report the absolute CPU time value, and don't try to calculate the deltas. There is a virt-top program that might like to use this data to provide a continuous display of utilization. Alternatively, we could add an arg for this to request that it calculate delta over 'n' seconds. 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list