[libvirt] [PATCH 10/11] qemu: bulk stats: implement block group
Li Wei
lw at cn.fujitsu.com
Mon Sep 1 05:32:37 UTC 2014
Hi Francesco,
I notice your patchset is much complete than mine which only focus on
VIR_DOMAIN_STATS_BLOCK[1], but it seems your patch implement block stats
query in a per-block style, this should be a bottleneck when there are
a lot of block devices in a domain.
Could you implement it in a bulk style? so we just need only one qmp-command
for each domain.
[1]: https://www.redhat.com/archives/libvir-list/2014-August/msg01497.html
Thanks,
Li Wei
On 08/29/2014 03:15 PM, Francesco Romani wrote:
> This patch implements the VIR_DOMAIN_STATS_BLOCK
> group of statistics.
>
> Signed-off-by: Francesco Romani <fromani at redhat.com>
> ---
> include/libvirt/libvirt.h.in | 1 +
> src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 8c15583..372e098 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2515,6 +2515,7 @@ typedef enum {
> VIR_DOMAIN_STATS_BALLOON = (1 << 2), /* return domain balloon info */
> VIR_DOMAIN_STATS_VCPU = (1 << 3), /* return domain virtual CPU info */
> VIR_DOMAIN_STATS_INTERFACE = (1 << 4), /* return domain interfaces info */
> + VIR_DOMAIN_STATS_BLOCK = (1 << 5), /* return domain block info */
> } virDomainStatsTypes;
>
> typedef enum {
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 818fcbc..344b02e 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -17552,6 +17552,59 @@ qemuDomainGetStatsInterface(virConnectPtr conn ATTRIBUTE_UNUSED,
>
> #undef QEMU_ADD_NET_PARAM
>
> +#define QEMU_ADD_BLOCK_PARAM(RECORD, MAXPARAMS, BLOCK, NAME, VALUE) \
> +do { \
> + char param_name[NAME_MAX]; \
> + snprintf(param_name, NAME_MAX, "block.%s.%s", BLOCK, NAME); \
> + if (virTypedParamsAddLLong(&RECORD->params, \
> + &RECORD->nparams, \
> + MAXPARAMS, \
> + param_name, \
> + VALUE) < 0) \
> + return -1; \
> +} while (0)
> +
> +static int
> +qemuDomainGetStatsBlock(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virDomainObjPtr dom,
> + virDomainStatsRecordPtr record,
> + int *maxparams,
> + unsigned int privflags ATTRIBUTE_UNUSED)
> +{
> + virQEMUDriverPtr driver = conn->privateData;
> + struct qemuBlockStats stats;
> + size_t i;
> +
> + for (i = 0; i < dom->def->ndisks; i++) {
> + memset(&stats, 0, sizeof(stats));
> +
> + if (qemuDiskGetBlockStats(driver, dom, dom->def->disks[i], &stats) < 0)
> + continue;
> +
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "rd.reqs", stats.rd_req);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "rd.bytes", stats.rd_bytes);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "rd.times", stats.rd_total_times);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "wr.reqs", stats.wr_req);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "wr.bytes", stats.wr_bytes);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "wr.times", stats.wr_total_times);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "fl.reqs", stats.flush_req);
> + QEMU_ADD_BLOCK_PARAM(record, maxparams, dom->def->disks[i]->dst,
> + "fl.times", stats.flush_total_times);
> + }
> +
> + return 0;
> +}
> +
> +#undef QEMU_ADD_BLOCK_PARAM
> +
> +
> typedef int
> (*qemuDomainGetStatsFunc)(virConnectPtr conn,
> virDomainObjPtr dom,
> @@ -17570,6 +17623,7 @@ static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = {
> { qemuDomainGetStatsBalloon, VIR_DOMAIN_STATS_BALLOON },
> { qemuDomainGetStatsVcpu, VIR_DOMAIN_STATS_VCPU },
> { qemuDomainGetStatsInterface, VIR_DOMAIN_STATS_INTERFACE },
> + { qemuDomainGetStatsBlock, VIR_DOMAIN_STATS_BLOCK },
> { NULL, 0 }
> };
>
>
More information about the libvir-list
mailing list