From nobody Sun May 19 02:06:35 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 148836910658863.871599703092556; Wed, 1 Mar 2017 03:51:46 -0800 (PST) Received: from localhost ([::1]:45884 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2nI-00048O-Et for importer@patchew.org; Wed, 01 Mar 2017 06:51:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49826) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2mC-0003xP-E8 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cj2mB-0007Ax-FD for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:36 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59446) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cj2m8-00079P-1j; Wed, 01 Mar 2017 06:50:32 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (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 2136E3B731; Wed, 1 Mar 2017 11:50:32 +0000 (UTC) Received: from localhost (ovpn-117-126.ams2.redhat.com [10.36.117.126]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v21BoUPj010742; Wed, 1 Mar 2017 06:50:31 -0500 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Date: Wed, 1 Mar 2017 11:50:24 +0000 Message-Id: <20170301115026.22621-2-stefanha@redhat.com> In-Reply-To: <20170301115026.22621-1-stefanha@redhat.com> References: <20170301115026.22621-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 01 Mar 2017 11:50:32 +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 v3 1/3] 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 Reviewed-by: Greg Kurz --- qemu-options.hx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx index c85f77d..bbd1bd9 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -607,6 +607,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 19 02:06:35 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 1488369095641241.95110763044624; Wed, 1 Mar 2017 03:51:35 -0800 (PST) Received: from localhost ([::1]:45882 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2n8-0003zv-1L for importer@patchew.org; Wed, 01 Mar 2017 06:51:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49842) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2mD-0003xw-1I for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cj2mC-0007BG-13 for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37272) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cj2m9-0007AB-OL; Wed, 01 Mar 2017 06:50:33 -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 D50694E4C6; Wed, 1 Mar 2017 11:50:33 +0000 (UTC) Received: from localhost (ovpn-117-126.ams2.redhat.com [10.36.117.126]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6C30C63700; Wed, 1 Mar 2017 11:50:33 +0000 (UTC) From: Stefan Hajnoczi To: qemu-devel@nongnu.org Date: Wed, 1 Mar 2017 11:50:25 +0000 Message-Id: <20170301115026.22621-3-stefanha@redhat.com> In-Reply-To: <20170301115026.22621-1-stefanha@redhat.com> References: <20170301115026.22621-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.38]); Wed, 01 Mar 2017 11:50:33 +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 v3 2/3] throttle: do not use invalid config in test 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 (burst) max parameter cannot be smaller than the avg parameter. There is a test case that uses avg =3D 56, max =3D 1 and gets away with it because no input validation is performed by the test case. This patch switches to valid test input parameters. Signed-off-by: Stefan Hajnoczi Reviewed-by: Alberto Garcia --- tests/test-throttle.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 363b59a..8531809 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; /* should be correcte= d */ + orig_cfg.buckets[THROTTLE_BPS_READ].max =3D 56; /* should not be corr= ected */ 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 15.3); /* fi= xed */ + g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max =3D=3D 56); /* no= t fixed */ 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); --=20 2.9.3 From nobody Sun May 19 02:06:35 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 1488369192418567.5993099860315; Wed, 1 Mar 2017 03:53:12 -0800 (PST) Received: from localhost ([::1]:45888 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2of-0005zi-Vk for importer@patchew.org; Wed, 01 Mar 2017 06:53:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49874) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cj2mF-000403-OZ for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cj2mE-0007CG-TR for qemu-devel@nongnu.org; Wed, 01 Mar 2017 06:50:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45588) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cj2mC-0007Au-1E; Wed, 01 Mar 2017 06:50:36 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (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 1E01A37F1F; Wed, 1 Mar 2017 11:50:36 +0000 (UTC) Received: from localhost (ovpn-117-126.ams2.redhat.com [10.36.117.126]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v21BoY7V028741; Wed, 1 Mar 2017 06:50:35 -0500 From: Stefan Hajnoczi To: qemu-devel@nongnu.org Date: Wed, 1 Mar 2017 11:50:26 +0000 Message-Id: <20170301115026.22621-4-stefanha@redhat.com> In-Reply-To: <20170301115026.22621-1-stefanha@redhat.com> References: <20170301115026.22621-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 01 Mar 2017 11:50:36 +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 v3 3/3] 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 | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 8531809..2a8bf64 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 correcte= d */ - orig_cfg.buckets[THROTTLE_BPS_READ].max =3D 56; /* should not be corr= ected */ + orig_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D 0; + orig_cfg.buckets[THROTTLE_BPS_READ].max =3D 56; 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); /* fi= xed */ - g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max =3D=3D 56); /* no= t fixed */ + g_assert(final_cfg.buckets[THROTTLE_BPS_TOTAL].max =3D=3D 0); + g_assert(final_cfg.buckets[THROTTLE_BPS_READ].max =3D=3D 56); 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..3570ed2 100644 --- a/util/throttle.c +++ b/util/throttle.c @@ -380,6 +380,14 @@ static void throttle_fix_bucket(LeakyBucket *bkt) } } =20 +/* undo internal bucket parameter changes (see throttle_fix_bucket()) */ +static void throttle_unfix_bucket(LeakyBucket *bkt) +{ + if (bkt->max < bkt->avg) { + bkt->max =3D 0; + } +} + /* take care of canceling a timer */ static void throttle_cancel_timer(QEMUTimer *timer) { @@ -420,7 +428,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