From 57b65c58d0e935ce31a0d3ea3e820edc4ddc3d10 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Mon, 8 Jul 2013 13:19:43 -0400 Subject: [PATCH] Allow balloon driver collection to be adjusted dynamically Use the virDomainSetMemoryStatsPeriodFlags() to pass a period defined by usage of a new --period option in order to set the collection period for the balloon driver. This may enable or disable the collection based on the value. Add the --current, --live, & --config options to dommemstat. --- docs/formatdomain.html.in | 11 +++++- tools/virsh-domain-monitor.c | 66 ++++++++++++++++++++++++++++++++++-- tools/virsh.pod | 22 +++++++++++- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index a1cc1e10e..b1c3bfca3 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -4664,7 +4664,16 @@ qemu-kvm -net nic,model=? /dev/null

The optional period allows the QEMU virtio memory balloon driver to provide statistics through the virsh - dommemstat [domain] command. + dommemstat [domain] command. By default, collection is + not enabled. In order to enable, use the virsh dommemstat + [domain] --period [number] command or virsh edit + command to add the option to the XML definition. + The virsh dommemstat will accept the options + --live, --current, or --config. + If an option is not provided, the change for a running domain will + only be made to the active guest. + If the QEMU driver is not at the right + revision, the attempt to set the period will fail. Since 1.1.1, requires QEMU 1.5

diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 5fbd32c16..773f96d8b 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -314,6 +314,23 @@ static const vshCmdOptDef opts_dommemstat[] = { .flags = VSH_OFLAG_REQ, .help = N_("domain name, id or uuid") }, + {.name = "period", + .type = VSH_OT_DATA, + .flags = VSH_OFLAG_REQ_OPT, + .help = N_("period in seconds to set collection") + }, + {.name = "config", + .type = VSH_OT_BOOL, + .help = N_("affect next boot") + }, + {.name = "live", + .type = VSH_OT_BOOL, + .help = N_("affect running domain") + }, + {.name = "current", + .type = VSH_OT_BOOL, + .help = N_("affect current domain") + }, {.name = NULL} }; @@ -325,15 +342,56 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd) struct _virDomainMemoryStat stats[VIR_DOMAIN_MEMORY_STAT_NR]; unsigned int nr_stats; size_t i; + int ret = false; + int rv = 0; + int period = -1; + bool config = vshCommandOptBool(cmd, "config"); + bool live = vshCommandOptBool(cmd, "live"); + bool current = vshCommandOptBool(cmd, "current"); + unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT; + + VSH_EXCLUSIVE_OPTIONS_VAR(current, live); + VSH_EXCLUSIVE_OPTIONS_VAR(current, config); + if (config) + flags |= VIR_DOMAIN_AFFECT_CONFIG; + if (live) + flags |= VIR_DOMAIN_AFFECT_LIVE; if (!(dom = vshCommandOptDomain(ctl, cmd, &name))) return false; + /* If none of the options were specified and we're active + * then be sure to allow active modification */ + if (!current && !live && !config && virDomainIsActive(dom) == 1) + flags |= VIR_DOMAIN_AFFECT_LIVE; + + /* Providing a period will adjust the balloon driver collection period. + * This is not really an unsigned long, but it + */ + if ((rv = vshCommandOptInt(cmd, "period", &period)) < 0) { + vshError(ctl, "%s", + _("Unable to parse integer parameter.")); + goto cleanup; + } + if (rv > 0) { + if (period < 0) { + vshError(ctl, _("Invalid collection period value '%d'"), period); + goto cleanup; + } + + if (virDomainSetMemoryStatsPeriod(dom, period, flags) < 0) { + vshError(ctl, "%s", + _("Unable to change balloon collection period.")); + } else { + ret = true; + } + goto cleanup; + } + nr_stats = virDomainMemoryStats(dom, stats, VIR_DOMAIN_MEMORY_STAT_NR, 0); if (nr_stats == -1) { vshError(ctl, _("Failed to get memory statistics for domain %s"), name); - virDomainFree(dom); - return false; + goto cleanup; } for (i = 0; i < nr_stats; i++) { @@ -355,8 +413,10 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd) vshPrint(ctl, "rss %llu\n", stats[i].val); } + ret = true; +cleanup: virDomainFree(dom); - return true; + return ret; } /* diff --git a/tools/virsh.pod b/tools/virsh.pod index 51644d911..7008a578f 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -668,10 +668,30 @@ Both I<--live> and I<--current> flags may be given, but I<--current> is exclusive. If no flag is specified, behavior is different depending on hypervisor. -=item B I +=item B I [I<--period> B] +[[I<--config>] [I<--live>] | [I<--current>]] Get memory stats for a running domain. +Depending on the hypervisor a variety of statistics can be returned + +For QEMU/KVM with a memory balloon, setting the optional I<--period> to a +value larger than 0 in seconds will allow the balloon driver to return +additional statistics which will be displayed by subsequent B +commands. Setting the I<--period> to 0 will stop the balloon driver collection, +but does not clear the statistics in the balloon driver. Requires at least +QEMU/KVM 1.5 to be running on the host. + +The I<--live>, I<--config>, and I<--current> flags are only valid when using +the I<--period> option in order to set the collection period for the balloon +driver. If I<--live> is specified, only the running guest collection period +is affected. If I<--config> is specified, affect the next boot of a persistent +guest. If I<--current> is specified, affect the current guest state. + +Both I<--live> and I<--config> flags may be given, but I<--current> is +exclusive. If no flag is specified, behavior is different depending +on the guest state. + =item B I Show errors on block devices. This command usually comes handy when -- 2.39.5