On Tue, 19 Apr 2011 12:01:34 +0100
"Daniel P. Berrange" <berrange(a)redhat.com> wrote:
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(a)mxm.nes.nec.co.jp>
> ---
> 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.
Matthias said, ESX cannot get absolute CPU time.
It just get CPU percentage.
http://www.mail-archive.com/libvir-list@redhat.com/msg35769.html
And I think CPU percentage is very useful for user.
The user don't care about absolute CPU time value.
They want to know about CPU load of each host.
So I wrote this specification.
Alternatively, we could add an arg for this to request that it
calculate
delta over 'n' seconds.
I agree. It's very userful.
But ESX cannot change interval, perhaps.
--
Minoru Usui <usui(a)mxm.nes.nec.co.jp>