[PATCH v3 1/1] qemu: add per-vcpu delay stats

Peter Krempa pkrempa at redhat.com
Mon Feb 15 11:47:31 UTC 2021


On Mon, Feb 15, 2021 at 14:21:45 +0300, Aleksei Zakharov wrote:
> This patch adds delay time (steal time inside guest) to libvirt
> domain per-vcpu stats. Delay time is a consequence of the overloaded
> CPU. Knowledge of the delay time of a virtual machine helps to react
> exactly when needed and rebalance the load between hosts.
> This is used by cloud providers to provide quality of service,
> especially when the CPU is oversubscripted.
> 
> It's more convenient to work with this metric in a context of a
> libvirt domain. Any monitoring software may use this information.

This is a code review, I didn't have the chance to look up more on
whether it makes actually sense to expose this.

> 
> Signed-off-by: Aleksei Zakharov <zaharov at selectel.ru>
> ---
>  src/qemu/qemu_driver.c | 40 +++++++++++++++++++++++++++++++++++++---
>  1 file changed, 37 insertions(+), 3 deletions(-)

Also always post new versions of the patches as a new thread, don't
reply to existing threads.

> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 3d54653217..319bc60632 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1332,6 +1332,29 @@ static char *qemuConnectGetCapabilities(virConnectPtr conn) {
>      return virCapabilitiesFormatXML(caps);
>  }
>  
> +static int
> +qemuGetSchedstatDelay(unsigned long long *cpudelay,
> +                 pid_t pid, pid_t tid)
> +{
> +    g_autofree char *proc = NULL;
> +    unsigned long long oncpu = 0;
> +    g_autofree FILE *schedstat = NULL;

This will just g_free() the pointer [1]...

> +
> +    if (tid)
> +        proc = g_strdup_printf("/proc/%d/task/%d/schedstat", (int)pid, (int)tid);
> +    else
> +        proc = g_strdup_printf("/proc/%d/schedstat", (int)pid);
> +    if (!proc)
> +        return -1;

proc can't be NULL here g_strdup_printf either returns a pointer or
aborts.

> +
> +    schedstat = fopen(proc, "r");
> +    if (!schedstat || fscanf(schedstat, "%llu %llu", &oncpu, cpudelay) < 2) {
> +            return -1;

Alignment is off.


...[1] so if fscanf fails the file will not be closed.

The caller also expects that a libvirt error is reported on failure
since it doesn't report own errors, so please make sure you do so.

Additionally similarly to qemuGetSchedInfo I don't think we should make
the failure to open the file fatal since it's just stats.


> +    }
> +
> +    VIR_FORCE_FCLOSE(schedstat);
> +    return 0;
> +}
>  
>  static int
>  qemuGetSchedInfo(unsigned long long *cpuWait,

[...]

> @@ -17870,7 +17899,6 @@ qemuDomainGetStatsMemoryBandwidth(virQEMUDriverPtr driver,
>      return ret;
>  }
>  
> -

Don't delete unrelated whitespace.

>  static int
>  qemuDomainGetStatsCpuCache(virQEMUDriverPtr driver,
>                             virDomainObjPtr dom,

[...]

> @@ -18104,6 +18134,10 @@ qemuDomainGetStatsVcpu(virQEMUDriverPtr driver,
>                                         "vcpu.%u.wait", cpuinfo[i].number) < 0)
>              goto cleanup;
>  
> +        if (virTypedParamListAddULLong(params, cpudelay[i],
> +                                        "vcpu.%u.delay", cpuinfo[i].number) < 0)
> +            goto cleanup;

Addition of a new stats field must be documented both in the public API
docs and the virsh docs. Just look for any of the existing docs in:

src/libvirt-domain.c and docs/manpages/virsh.rst

> +
>          /* state below is extracted from the individual vcpu structs */
>          if (!(vcpu = virDomainDefGetVcpu(dom->def, cpuinfo[i].number)))
>              continue;
> -- 
> 2.17.1
> 




More information about the libvir-list mailing list