From nobody Sun May 5 01:18:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488281355801993.929659173126; Tue, 28 Feb 2017 03:29:15 -0800 (PST) Received: from localhost ([::1]:60365 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cifxy-0006YI-Au for importer@patchew.org; Tue, 28 Feb 2017 06:29:14 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48733) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cifon-0007jn-6p for qemu-devel@nongnu.org; Tue, 28 Feb 2017 06:19:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cifol-0006Ht-Qe for qemu-devel@nongnu.org; Tue, 28 Feb 2017 06:19:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46332) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cifoi-0006Fm-D8; Tue, 28 Feb 2017 06:19:40 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D39EC057FA5; Tue, 28 Feb 2017 11:19:40 +0000 (UTC) Received: from localhost (ovpn-117-171.ams2.redhat.com [10.36.117.171]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F1432D655; Tue, 28 Feb 2017 11:19:39 +0000 (UTC) From: Stefan Hajnoczi To: qemu-devel@nongnu.org Date: Tue, 28 Feb 2017 11:19:34 +0000 Message-Id: <20170228111935.10826-2-stefanha@redhat.com> In-Reply-To: <20170228111935.10826-1-stefanha@redhat.com> References: <20170228111935.10826-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 28 Feb 2017 11:19:40 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 1/2] qemu-options: explain disk I/O throttling options X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nini Gu , Alberto Garcia , Stefan Hajnoczi , qemu-block@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Cc: Alberto Garcia Signed-off-by: Stefan Hajnoczi Reviewed-by: Alberto Garcia --- 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=3D@var{b},bps_rd=3D@var{r},bps_wr=3D@var{w} +Specify bandwidth throttling limits in bytes per second, either for all re= quest +types or for reads or writes only. Small values can lead to timeouts or h= angs +inside the guest. A safe minimum for disks is 2 MB/s. +@item bps_max=3D@var{bm},bps_rd_max=3D@var{rm},bps_wr_max=3D@var{wm} +Specify bursts in bytes per second, either for all request types or for re= ads +or writes only. Bursts allow the guest I/O to spike above the limit +temporarily. +@item iops=3D@var{i},iops_rd=3D@var{r},iops_wr=3D@var{w} +Specify request rate limits in requests per second, either for all request +types or for reads or writes only. +@item iops_max=3D@var{bm},iops_rd_max=3D@var{rm},iops_wr_max=3D@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=3D@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=3D@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 di= sks +instead of a single larger disk. @end table =20 By default, the @option{cache=3Dwriteback} mode is used. It will report da= ta --=20 2.9.3 From nobody Sun May 5 01:18:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1488281194902899.0636055645153; Tue, 28 Feb 2017 03:26:34 -0800 (PST) Received: from localhost ([::1]:60331 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cifvM-0004T0-Hm for importer@patchew.org; Tue, 28 Feb 2017 06:26:32 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48745) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cifop-0007l2-2e for qemu-devel@nongnu.org; Tue, 28 Feb 2017 06:19:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cifoo-0006IS-23 for qemu-devel@nongnu.org; Tue, 28 Feb 2017 06:19:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:60380) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cifok-0006Gv-Vq; Tue, 28 Feb 2017 06:19:43 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CD6937F1F; Tue, 28 Feb 2017 11:19:43 +0000 (UTC) Received: from localhost (ovpn-117-171.ams2.redhat.com [10.36.117.171]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1SBJfi5003714; Tue, 28 Feb 2017 06:19:42 -0500 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Date: Tue, 28 Feb 2017 11:19:35 +0000 Message-Id: <20170228111935.10826-3-stefanha@redhat.com> In-Reply-To: <20170228111935.10826-1-stefanha@redhat.com> References: <20170228111935.10826-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 28 Feb 2017 11:19:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 2/2] throttle: make throttle_config(throttle_get_config()) symmetric X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nini Gu , Alberto Garcia , Stefan Hajnoczi , qemu-block@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Stefan Hajnoczi Reviewed-by: Alberto Garcia --- 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 =3D 69; orig_cfg.buckets[THROTTLE_OPS_WRITE].avg =3D 23; =20 - orig_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D 0; /* should be corrected= */ - orig_cfg.buckets[THROTTLE_BPS_READ].max =3D 1; /* should not be corre= cted */ + orig_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D 0; + orig_cfg.buckets[THROTTLE_BPS_READ].max =3D 1; orig_cfg.buckets[THROTTLE_BPS_WRITE].max =3D 120; =20 orig_cfg.buckets[THROTTLE_OPS_TOTAL].max =3D 150; @@ -246,8 +246,8 @@ static void test_config_functions(void) g_assert(final_cfg.buckets[THROTTLE_OPS_READ].avg =3D=3D 69); g_assert(final_cfg.buckets[THROTTLE_OPS_WRITE].avg =3D=3D 23); =20 - g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D=3D 15.3);/* fix= ed */ - g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max =3D=3D 1); /* not= fixed */ + g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D=3D 0); + g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max =3D=3D 1); g_assert(final_cfg.buckets[THROTTLE_BPS_WRITE].max =3D=3D 120); =20 g_assert(final_cfg.buckets[THROTTLE_OPS_TOTAL].max =3D=3D 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) } } =20 +/* undo internal bucket parameter changes (see throttle_fix_bucket()) */ +static void throttle_unfix_bucket(LeakyBucket *bkt) +{ + double min =3D bkt->avg / 10; + + if (bkt->max =3D=3D min) { + bkt->max =3D 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 =3D ts->cfg; + + for (i =3D 0; i < BUCKETS_COUNT; i++) { + throttle_unfix_bucket(&cfg->buckets[i]); + } } =20 =20 --=20 2.9.3