Introduce domdirtyrate-calc virsh api to start calculating domain's
memory dirty rate:
# virsh domdirtyrate-calc <domain> [--seconds <sec>]
Signed-off-by: Hao Wang <wanghao232@huawei.com>
---
docs/manpages/virsh.rst | 17 +++++++++++
tools/virsh-domain.c | 63 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+)
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index 8a4328faa0..417ea444f4 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -1704,6 +1704,23 @@ states other than "ok" or "error" the command also prints number of
seconds elapsed since the control interface entered its current state.
+domdirtyrate-calc
+-----------------
+
+**Syntax:**
+
+::
+
+ domdirtyrate-calc <domain> [--seconds <sec>]
+
+Calculate an active domain's memory dirty rate which may be expected by
+user in order to decide whether it's proper to be migrated out or not.
+The ``seconds`` parameter can be used to calculate dirty rate in a
+specific time which allows 60s at most now and would be default to 1s
+if missing. The calculated dirty rate infomation is available by calling
+'domstats --dirtyrate'.
+
+
domdisplay
----------
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index df33467646..ccb5d61a25 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -14412,6 +14412,63 @@ cmdSetUserSSHKeys(vshControl *ctl, const vshCmd *cmd)
}
+/*
+ * "domdirtyrate" command
+ */
+static const vshCmdInfo info_domdirtyrate_calc[] = {
+ {.name = "help",
+ .data = N_("Calculate a vm's memory dirty rate")
+ },
+ {.name = "desc",
+ .data = N_("Calculate memory dirty rate of a domain in order to decide whether "
+ "it's proper to be migrated out or not.\n"
+ "The calculated dirty rate infomation is available by calling "
+ "'domstats --dirtyrate'.")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_domdirtyrate_calc[] = {
+ VIRSH_COMMON_OPT_DOMAIN_FULL(0),
+ {.name = "seconds",
+ .type = VSH_OT_INT,
+ .help = N_("calculate memory dirty rate within specified seconds, "
+ "the supported value range from 1 to 60, default to 1.")
+ },
+ {.name = NULL}
+};
+
+static bool
+cmdDomDirtyRateCalc(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom = NULL;
+ int seconds;
+ int rc;
+ bool ret = false;
+
+ if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ rc = vshCommandOptInt(ctl, cmd, "seconds", &seconds);
+ if (rc < 0)
+ goto cleanup;
+
+ /* if no inputted seconds, default to 1s */
+ if (!rc)
+ seconds = 1;
+
+ if (virDomainStartDirtyRateCalc(dom, seconds, 0) < 0)
+ goto cleanup;
+
+ vshPrint(ctl, _("Start to calculate domain's memory dirty rate successfully.\n"));
+ ret = true;
+
+ cleanup:
+ virshDomainFree(dom);
+ return ret;
+}
+
+
const vshCmdDef domManagementCmds[] = {
{.name = "attach-device",
.handler = cmdAttachDevice,
@@ -15051,5 +15108,11 @@ const vshCmdDef domManagementCmds[] = {
.info = info_guestinfo,
.flags = 0
},
+ {.name = "domdirtyrate-calc",
+ .handler = cmdDomDirtyRateCalc,
+ .opts = opts_domdirtyrate_calc,
+ .info = info_domdirtyrate_calc,
+ .flags = 0
+ },
{.name = NULL}
};
--
2.23.0
On 2/26/21 9:35 AM, Hao Wang wrote:
> Introduce domdirtyrate-calc virsh api to start calculating domain's
> memory dirty rate:
> # virsh domdirtyrate-calc <domain> [--seconds <sec>]
>
> Signed-off-by: Hao Wang <wanghao232@huawei.com>
> ---
> docs/manpages/virsh.rst | 17 +++++++++++
> tools/virsh-domain.c | 63 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 80 insertions(+)
>
> diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
> index 8a4328faa0..417ea444f4 100644
> --- a/docs/manpages/virsh.rst
> +++ b/docs/manpages/virsh.rst
> @@ -1704,6 +1704,23 @@ states other than "ok" or "error" the command also prints number of
> seconds elapsed since the control interface entered its current state.
>
>
> +domdirtyrate-calc
> +-----------------
> +
> +**Syntax:**
> +
> +::
> +
> + domdirtyrate-calc <domain> [--seconds <sec>]
> +
> +Calculate an active domain's memory dirty rate which may be expected by
> +user in order to decide whether it's proper to be migrated out or not.
> +The ``seconds`` parameter can be used to calculate dirty rate in a
> +specific time which allows 60s at most now and would be default to 1s
> +if missing. The calculated dirty rate infomation is available by calling
> +'domstats --dirtyrate'.
> +
> +
> domdisplay
> ----------
>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index df33467646..ccb5d61a25 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -14412,6 +14412,63 @@ cmdSetUserSSHKeys(vshControl *ctl, const vshCmd *cmd)
> }
>
>
> +/*
> + * "domdirtyrate" command
> + */
> +static const vshCmdInfo info_domdirtyrate_calc[] = {
> + {.name = "help",
> + .data = N_("Calculate a vm's memory dirty rate")
> + },
> + {.name = "desc",
> + .data = N_("Calculate memory dirty rate of a domain in order to decide whether "
> + "it's proper to be migrated out or not.\n"
> + "The calculated dirty rate infomation is available by calling "
> + "'domstats --dirtyrate'.")
> + },
> + {.name = NULL}
> +};
> +
> +static const vshCmdOptDef opts_domdirtyrate_calc[] = {
> + VIRSH_COMMON_OPT_DOMAIN_FULL(0),
> + {.name = "seconds",
> + .type = VSH_OT_INT,
> + .help = N_("calculate memory dirty rate within specified seconds, "
> + "the supported value range from 1 to 60, default to 1.")
> + },
> + {.name = NULL}
> +};
> +
> +static bool
> +cmdDomDirtyRateCalc(vshControl *ctl, const vshCmd *cmd)
> +{
> + virDomainPtr dom = NULL;
> + int seconds;
> + int rc;
> + bool ret = false;
> +
> + if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> + return false;
> +
> + rc = vshCommandOptInt(ctl, cmd, "seconds", &seconds);
> + if (rc < 0)
> + goto cleanup;
> +
> + /* if no inputted seconds, default to 1s */
> + if (!rc)
> + seconds = 1;
The vshCommandOptInt() (and others too for that matter) are designed so
that if --argument is not present, then the destination variable is not
touched. So this can be rewritten as:
int seconds = 1; /* the default value is 1 */
rc = vshCommandOptInt(ctl, cmd, "seconds", &seconds);
if (rc < 0)
goto cleanup;
and since @rc is not used anywhere else it's not needed and thus can be
dropped.
> +
> + if (virDomainStartDirtyRateCalc(dom, seconds, 0) < 0)
> + goto cleanup;
> +
> + vshPrint(ctl, _("Start to calculate domain's memory dirty rate successfully.\n"));
This could be vshPrintExtra(). That's what we tend to use for this
affirmation prints. 'virsh -q' is quiet and can be used from a script,
'virsh' run by users gives them good feeling of something happening.
Michal
© 2016 - 2026 Red Hat, Inc.