{"id":808119,"url":"http://patchwork.ozlabs.org/api/patches/808119/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-4-stefanha@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170831082210.8362-4-stefanha@redhat.com>","list_archive_url":null,"date":"2017-08-31T08:21:58","name":"[PULL,for-2.10,03/15] throttle: Update the throttle_fix_bucket() documentation","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"d34f2602045943379e211fa5cd625c8026bef144","submitter":{"id":17227,"url":"http://patchwork.ozlabs.org/api/people/17227/?format=json","name":"Stefan Hajnoczi","email":"stefanha@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170831082210.8362-4-stefanha@redhat.com/mbox/","series":[{"id":766,"url":"http://patchwork.ozlabs.org/api/series/766/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=766","date":"2017-08-31T08:21:55","name":"[PULL,for-2.10,01/15] nvme: Fix get/set number of queues feature, again","version":1,"mbox":"http://patchwork.ozlabs.org/series/766/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/808119/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/808119/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=stefanha@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjb3j0zlKz9t2M\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 31 Aug 2017 18:23:13 +1000 (AEST)","from localhost ([::1]:54469 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnKkp-0005Jy-5t\n\tfor incoming@patchwork.ozlabs.org; Thu, 31 Aug 2017 04:23:11 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:42446)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKkA-0005GQ-BC\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:31 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <stefanha@redhat.com>) id 1dnKk6-0005pL-CW\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:30 -0400","from mx1.redhat.com ([209.132.183.28]:50798)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <stefanha@redhat.com>) id 1dnKk6-0005ot-49\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 04:22:26 -0400","from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 493C4C0546E1;\n\tThu, 31 Aug 2017 08:22:25 +0000 (UTC)","from localhost (ovpn-117-89.ams2.redhat.com [10.36.117.89])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 61275B2415;\n\tThu, 31 Aug 2017 08:22:22 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 493C4C0546E1","From":"Stefan Hajnoczi <stefanha@redhat.com>","To":"<qemu-devel@nongnu.org>","Date":"Thu, 31 Aug 2017 09:21:58 +0100","Message-Id":"<20170831082210.8362-4-stefanha@redhat.com>","In-Reply-To":"<20170831082210.8362-1-stefanha@redhat.com>","References":"<20170831082210.8362-1-stefanha@redhat.com>","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.12","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.32]);\n\tThu, 31 Aug 2017 08:22:25 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PULL for-2.10 03/15] throttle: Update the\n\tthrottle_fix_bucket() documentation","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Peter Maydell <peter.maydell@linaro.org>,\n\tAlberto Garcia <berto@igalia.com>, Stefan Hajnoczi <stefanha@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"From: Alberto Garcia <berto@igalia.com>\n\nThe way the throttling algorithm works is that requests start being\nthrottled once the bucket level exceeds the burst limit. When we get\nthere the bucket leaks at the level set by the user (bkt->avg), and\nthat leak rate is what prevents guest I/O from exceeding the desired\nlimit.\n\nIf we don't allow bursts (i.e. bkt->max == 0) then we can start\nthrottling requests immediately. The problem with keeping the\nthreshold at 0 is that it only allows one request at a time, and as\nsoon as there's a bit of I/O from the guest every other request will\nbe throttled and performance will suffer considerably. That can even\nmake the guest unable to reach the throttle limit if that limit is\nhigh enough, and that happens regardless of the block scheduler used\nby the guest.\n\nIncreasing that threshold gives flexibility to the guest, allowing it\nto perform short bursts of I/O before being throttled. Increasing the\nthreshold too much does not make a difference in the long run (because\nit's the leak rate what defines the actual throughput) but it does\nallow the guest to perform longer initial bursts and exceed the\nthrottle limit for a short while.\n\nA burst value of bkt->avg / 10 allows the guest to perform 100ms'\nworth of I/O at the target rate without being throttled.\n\nSigned-off-by: Alberto Garcia <berto@igalia.com>\nMessage-id: 31aae6645f0d1fbf3860fb2b528b757236f0c0a7.1503580370.git.berto@igalia.com\nSigned-off-by: Stefan Hajnoczi <stefanha@redhat.com>\n---\n util/throttle.c | 11 +++--------\n 1 file changed, 3 insertions(+), 8 deletions(-)","diff":"diff --git a/util/throttle.c b/util/throttle.c\nindex b2a52b8b34..9a6bda813c 100644\n--- a/util/throttle.c\n+++ b/util/throttle.c\n@@ -366,14 +366,9 @@ static void throttle_fix_bucket(LeakyBucket *bkt)\n     /* zero bucket level */\n     bkt->level = bkt->burst_level = 0;\n \n-    /* The following is done to cope with the Linux CFQ block scheduler\n-     * which regroup reads and writes by block of 100ms in the guest.\n-     * When they are two process one making reads and one making writes cfq\n-     * make a pattern looking like the following:\n-     * WWWWWWWWWWWRRRRRRRRRRRRRRWWWWWWWWWWWWWwRRRRRRRRRRRRRRRRR\n-     * Having a max burst value of 100ms of the average will help smooth the\n-     * throttling\n-     */\n+    /* If bkt->max is 0 we still want to allow short bursts of I/O\n+     * from the guest, otherwise every other request will be throttled\n+     * and performance will suffer considerably. */\n     min = bkt->avg / 10;\n     if (bkt->avg && !bkt->max) {\n         bkt->max = min;\n","prefixes":["PULL","for-2.10","03/15"]}