From patchwork Thu Aug 24 13:24:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alberto Garcia X-Patchwork-Id: 805496 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=igalia.com header.i=@igalia.com header.b="cnIJkPtT"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xdQDg4FCcz9s7m for ; Thu, 24 Aug 2017 23:31:31 +1000 (AEST) Received: from localhost ([::1]:48664 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dksEL-0007et-FK for incoming@patchwork.ozlabs.org; Thu, 24 Aug 2017 09:31:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41977) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dks90-0003JU-Gh for qemu-devel@nongnu.org; Thu, 24 Aug 2017 09:26:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dks8w-0003U1-GB for qemu-devel@nongnu.org; Thu, 24 Aug 2017 09:25:58 -0400 Received: from fanzine.igalia.com ([91.117.99.155]:53893) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dks8w-000339-1t; Thu, 24 Aug 2017 09:25:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=References:In-Reply-To:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=vYXLlm26x4quiIx+vrPnFr4ce7RsOelgS74XahQvaK4=; b=cnIJkPtTQCfu9wT3yNwv0oiMBPiIkfaMyuMKDsRR1K2+agsfkSdrlmPYXXqZqURepApKqSfAq8Jdbw2iOyDRaK49VrxPV8/ptYUYaTAUZRNyD7/xQ3xCLCtb+gQa4n7cqa9fLe+FN6Ol4hjivh5wAfa+2Y/W9wusnRqhPSzptOUf2WAk8cK0lBNg6TpAiQlMV/fRHTQjw/+Ezqr3LCCFwZaGnvP7KAaqQpjjj9I9BjDjKJXJUALXpfk3mny3nmovqj94gQJaQfkC/k3qatQwuMc3gmv5OLXGi/cnTvwZOnp5K+HuBKB1nPT4ybbAqkyeij4bIgADszp/BPZBYTsFDA==; Received: from [194.100.51.2] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1dks8H-0002oN-V4; Thu, 24 Aug 2017 15:25:14 +0200 Received: from berto by perseus.local with local (Exim 4.89) (envelope-from ) id 1dks80-0007cp-Os; Thu, 24 Aug 2017 16:24:56 +0300 From: Alberto Garcia To: qemu-devel@nongnu.org Date: Thu, 24 Aug 2017 16:24:44 +0300 Message-Id: <31aae6645f0d1fbf3860fb2b528b757236f0c0a7.1503580370.git.berto@igalia.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 91.117.99.155 Subject: [Qemu-devel] [PATCH v2 2/7] throttle: Update the throttle_fix_bucket() documentation 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: Alberto Garcia , Markus Armbruster , qemu-block@nongnu.org, Manos Pitsidianakis Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The way the throttling algorithm works is that requests start being throttled once the bucket level exceeds the burst limit. When we get there the bucket leaks at the level set by the user (bkt->avg), and that leak rate is what prevents guest I/O from exceeding the desired limit. If we don't allow bursts (i.e. bkt->max == 0) then we can start throttling requests immediately. The problem with keeping the threshold at 0 is that it only allows one request at a time, and as soon as there's a bit of I/O from the guest every other request will be throttled and performance will suffer considerably. That can even make the guest unable to reach the throttle limit if that limit is high enough, and that happens regardless of the block scheduler used by the guest. Increasing that threshold gives flexibility to the guest, allowing it to perform short bursts of I/O before being throttled. Increasing the threshold too much does not make a difference in the long run (because it's the leak rate what defines the actual throughput) but it does allow the guest to perform longer initial bursts and exceed the throttle limit for a short while. A burst value of bkt->avg / 10 allows the guest to perform 100ms' worth of I/O at the target rate without being throttled. Signed-off-by: Alberto Garcia Reviewed-by: Eric Blake --- util/throttle.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/util/throttle.c b/util/throttle.c index b2a52b8b34..9a6bda813c 100644 --- a/util/throttle.c +++ b/util/throttle.c @@ -366,14 +366,9 @@ static void throttle_fix_bucket(LeakyBucket *bkt) /* zero bucket level */ bkt->level = bkt->burst_level = 0; - /* The following is done to cope with the Linux CFQ block scheduler - * which regroup reads and writes by block of 100ms in the guest. - * When they are two process one making reads and one making writes cfq - * make a pattern looking like the following: - * WWWWWWWWWWWRRRRRRRRRRRRRRWWWWWWWWWWWWWwRRRRRRRRRRRRRRRRR - * Having a max burst value of 100ms of the average will help smooth the - * throttling - */ + /* If bkt->max is 0 we still want to allow short bursts of I/O + * from the guest, otherwise every other request will be throttled + * and performance will suffer considerably. */ min = bkt->avg / 10; if (bkt->avg && !bkt->max) { bkt->max = min;