* [Qemu-devel] [PATCH v2 0/2] throttle: improve command-line parameter documentation
@ 2017-02-28 11:19 Stefan Hajnoczi
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options Stefan Hajnoczi
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric Stefan Hajnoczi
0 siblings, 2 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-28 11:19 UTC (permalink / raw)
To: qemu-devel; +Cc: Nini Gu, qemu-block, Alberto Garcia, Stefan Hajnoczi
v2:
* Fixed s/bps/iops/ copy-paste error in Patch 1 [Berto]
* Rephrased warning about guest hangs and errors [Berto]
* Added Patch 2 to hide the internal .max value from the monitor
Patch 1 fleshes out the documentation for I/O throttling command-line
parameters.
Patch 2 hides an internal value that was being exposed to users via the
monitor and caused confusion.
I ended up not adding QMP-style throttling.* names to the command-line
documentation because the names are very long and unlikely to be used. I
couldn't see a nice way of adding them while still keeping the documentation
readable.
Stefan Hajnoczi (2):
qemu-options: explain disk I/O throttling options
throttle: make throttle_config(throttle_get_config()) symmetric
tests/test-throttle.c | 8 ++++----
util/throttle.c | 16 ++++++++++++++++
qemu-options.hx | 24 ++++++++++++++++++++++++
3 files changed, 44 insertions(+), 4 deletions(-)
--
2.9.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options
2017-02-28 11:19 [Qemu-devel] [PATCH v2 0/2] throttle: improve command-line parameter documentation Stefan Hajnoczi
@ 2017-02-28 11:19 ` Stefan Hajnoczi
2017-02-28 12:02 ` Alberto Garcia
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric Stefan Hajnoczi
1 sibling, 1 reply; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-28 11:19 UTC (permalink / raw)
To: qemu-devel; +Cc: Nini Gu, qemu-block, Alberto Garcia, Stefan Hajnoczi
The disk I/O throttling options have been listed for a long time but
never explained on the QEMU man page.
Suggested-by: Nini Gu <ngu@redhat.com>
Cc: Alberto Garcia <berto@igalia.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
qemu-options.hx | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/qemu-options.hx b/qemu-options.hx
index 5633d39..c609b05 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -587,6 +587,30 @@ file sectors into the image file.
conversion of plain zero writes by the OS to driver specific optimized
zero write commands. You may even choose "unmap" if @var{discard} is set
to "unmap" to allow a zero write to be converted to an UNMAP operation.
+@item bps=@var{b},bps_rd=@var{r},bps_wr=@var{w}
+Specify bandwidth throttling limits in bytes per second, either for all request
+types or for reads or writes only. Small values can lead to timeouts or hangs
+inside the guest. A safe minimum for disks is 2 MB/s.
+@item bps_max=@var{bm},bps_rd_max=@var{rm},bps_wr_max=@var{wm}
+Specify bursts in bytes per second, either for all request types or for reads
+or writes only. Bursts allow the guest I/O to spike above the limit
+temporarily.
+@item iops=@var{i},iops_rd=@var{r},iops_wr=@var{w}
+Specify request rate limits in requests per second, either for all request
+types or for reads or writes only.
+@item iops_max=@var{bm},iops_rd_max=@var{rm},iops_wr_max=@var{wm}
+Specify bursts in requests per second, either for all request types or for reads
+or writes only. Bursts allow the guest I/O to spike above the limit
+temporarily.
+@item iops_size=@var{is}
+Let every @var{is} bytes of a request count as a new request for iops
+throttling purposes. Use this option to prevent guests from circumventing iops
+limits by sending fewer but larger requests.
+@item group=@var{g}
+Join a throttling quota group with given name @var{g}. All drives that are
+members of the same group are accounted for together. Use this option to
+prevent guests from circumventing throttling limits by using many small disks
+instead of a single larger disk.
@end table
By default, the @option{cache=writeback} mode is used. It will report data
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric
2017-02-28 11:19 [Qemu-devel] [PATCH v2 0/2] throttle: improve command-line parameter documentation Stefan Hajnoczi
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options Stefan Hajnoczi
@ 2017-02-28 11:19 ` Stefan Hajnoczi
2017-02-28 12:17 ` Alberto Garcia
1 sibling, 1 reply; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-28 11:19 UTC (permalink / raw)
To: qemu-devel; +Cc: Nini Gu, qemu-block, Alberto Garcia, Stefan Hajnoczi
Throttling has a weird property that throttle_get_config() does not
always return the same throttling settings that were given with
throttle_config(). In other words, the set and get functions aren't
symmetric.
If .max is 0 then the throttling code assigns a default value of .avg /
10 in throttle_config(). This is an implementation detail of the
throttling algorithm. When throttle_get_config() is called the .max
value returned should still be 0.
Users are exposed to this quirk via "info block" or "query-block"
monitor commands. This has caused confusion because it looks like a bug
when an unexpected value is reported.
This patch hides the .max value adjustment in throttle_get_config() and
updates test-throttle.c appropriately.
Reported-by: Nini Gu <ngu@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
tests/test-throttle.c | 8 ++++----
util/throttle.c | 16 ++++++++++++++++
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/tests/test-throttle.c b/tests/test-throttle.c
index 363b59a..3d6bb82 100644
--- a/tests/test-throttle.c
+++ b/tests/test-throttle.c
@@ -205,8 +205,8 @@ static void test_config_functions(void)
orig_cfg.buckets[THROTTLE_OPS_READ].avg = 69;
orig_cfg.buckets[THROTTLE_OPS_WRITE].avg = 23;
- orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0; /* should be corrected */
- orig_cfg.buckets[THROTTLE_BPS_READ].max = 1; /* should not be corrected */
+ orig_cfg.buckets[THROTTLE_BPS_TOTAL].max = 0;
+ orig_cfg.buckets[THROTTLE_BPS_READ].max = 1;
orig_cfg.buckets[THROTTLE_BPS_WRITE].max = 120;
orig_cfg.buckets[THROTTLE_OPS_TOTAL].max = 150;
@@ -246,8 +246,8 @@ static void test_config_functions(void)
g_assert(final_cfg.buckets[THROTTLE_OPS_READ].avg == 69);
g_assert(final_cfg.buckets[THROTTLE_OPS_WRITE].avg == 23);
- g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 15.3);/* fixed */
- g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 1); /* not fixed */
+ g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max == 0);
+ g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max == 1);
g_assert(final_cfg.buckets[THROTTLE_BPS_WRITE].max == 120);
g_assert(final_cfg.buckets[THROTTLE_OPS_TOTAL].max == 150);
diff --git a/util/throttle.c b/util/throttle.c
index 3817d9b..d87b421 100644
--- a/util/throttle.c
+++ b/util/throttle.c
@@ -380,6 +380,16 @@ static void throttle_fix_bucket(LeakyBucket *bkt)
}
}
+/* undo internal bucket parameter changes (see throttle_fix_bucket()) */
+static void throttle_unfix_bucket(LeakyBucket *bkt)
+{
+ double min = bkt->avg / 10;
+
+ if (bkt->max == min) {
+ bkt->max = 0;
+ }
+}
+
/* take care of canceling a timer */
static void throttle_cancel_timer(QEMUTimer *timer)
{
@@ -420,7 +430,13 @@ void throttle_config(ThrottleState *ts,
*/
void throttle_get_config(ThrottleState *ts, ThrottleConfig *cfg)
{
+ int i;
+
*cfg = ts->cfg;
+
+ for (i = 0; i < BUCKETS_COUNT; i++) {
+ throttle_unfix_bucket(&cfg->buckets[i]);
+ }
}
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options Stefan Hajnoczi
@ 2017-02-28 12:02 ` Alberto Garcia
0 siblings, 0 replies; 6+ messages in thread
From: Alberto Garcia @ 2017-02-28 12:02 UTC (permalink / raw)
To: Stefan Hajnoczi, qemu-devel; +Cc: Nini Gu, qemu-block
On Tue 28 Feb 2017 12:19:34 PM CET, Stefan Hajnoczi wrote:
> The disk I/O throttling options have been listed for a long time but
> never explained on the QEMU man page.
>
> Suggested-by: Nini Gu <ngu@redhat.com>
> Cc: Alberto Garcia <berto@igalia.com>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Berto
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric Stefan Hajnoczi
@ 2017-02-28 12:17 ` Alberto Garcia
2017-03-01 10:44 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
0 siblings, 1 reply; 6+ messages in thread
From: Alberto Garcia @ 2017-02-28 12:17 UTC (permalink / raw)
To: Stefan Hajnoczi, qemu-devel; +Cc: Nini Gu, qemu-block
On Tue 28 Feb 2017 12:19:35 PM CET, Stefan Hajnoczi wrote:
> +/* undo internal bucket parameter changes (see throttle_fix_bucket()) */
> +static void throttle_unfix_bucket(LeakyBucket *bkt)
> +{
> + double min = bkt->avg / 10;
> +
> + if (bkt->max == min) {
> + bkt->max = 0;
> + }
> +}
I guess you could do the more general if (bkt->max < bkt->avg), but your
solution is also fine with me.
Reviewed-by: Alberto Garcia <berto@igalia.com>
Berto
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [Qemu-block] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric
2017-02-28 12:17 ` Alberto Garcia
@ 2017-03-01 10:44 ` Stefan Hajnoczi
0 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-03-01 10:44 UTC (permalink / raw)
To: Alberto Garcia; +Cc: Stefan Hajnoczi, qemu-devel, Nini Gu, qemu-block
[-- Attachment #1: Type: text/plain, Size: 888 bytes --]
On Tue, Feb 28, 2017 at 01:17:55PM +0100, Alberto Garcia wrote:
> On Tue 28 Feb 2017 12:19:35 PM CET, Stefan Hajnoczi wrote:
> > +/* undo internal bucket parameter changes (see throttle_fix_bucket()) */
> > +static void throttle_unfix_bucket(LeakyBucket *bkt)
> > +{
> > + double min = bkt->avg / 10;
> > +
> > + if (bkt->max == min) {
> > + bkt->max = 0;
> > + }
> > +}
>
> I guess you could do the more general if (bkt->max < bkt->avg), but your
> solution is also fine with me.
>
> Reviewed-by: Alberto Garcia <berto@igalia.com>
I did that originally because I try to avoid floating-point equality.
The test case uses an invalid setting though (->max = 1, ->avg = 56)
which would be rejected if given on the command-line.
Thinking about this again, it's probably better to modify the test case
and use max < avg.
Will send a v3.
Stefan
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-03-01 10:44 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-28 11:19 [Qemu-devel] [PATCH v2 0/2] throttle: improve command-line parameter documentation Stefan Hajnoczi
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options Stefan Hajnoczi
2017-02-28 12:02 ` Alberto Garcia
2017-02-28 11:19 ` [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric Stefan Hajnoczi
2017-02-28 12:17 ` Alberto Garcia
2017-03-01 10:44 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.