From: Wu Fengguang <fengguang.wu@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Jan Kara <jack@suse.cz>, Wu Fengguang <fengguang.wu@intel.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Rik van Riel <riel@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Greg Thelen <gthelen@google.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: linux-mm <linux-mm@kvack.org>
Cc: <linux-fsdevel@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 13/35] writeback: bdi base throttle bandwidth
Date: Mon, 13 Dec 2010 22:46:59 +0800 [thread overview]
Message-ID: <20101213150327.936117931@intel.com> (raw)
In-Reply-To: 20101213144646.341970461@intel.com
[-- Attachment #1: writeback-bw-for-concurrent-dirtiers.patch --]
[-- Type: text/plain, Size: 6713 bytes --]
This basically does
- task_bw = linear_function(task_weight, bdi_dirty, bdi->write_bandwidth)
+ task_bw = linear_function(task_weight, bdi_dirty, bdi->throttle_bandwidth)
where
adapt to
bdi->throttle_bandwidth ================> bdi->write_bandwidth / N
stabilize around
N = number of concurrent heavy dirtier tasks
(light dirtiers will have little effect)
It offers two great benefits:
1) in many configurations (eg. NFS), bdi->write_bandwidth fluctuates a lot
(more than 100%) by nature. bdi->throttle_bandwidth will be much more
stable. It will normally be a flat line in the time-bw graph.
2) bdi->throttle_bandwidth will be close to the final task_bw in stable state.
In contrast, bdi->write_bandwidth is N times larger than task_bw.
Given N=4, bdi_dirty will float around A before patch, and we want it
stabilize around B by lowering the slope of the control line, so that
when bdi_dirty fluctuates for the same delta (to points A'/B'), the
corresponding fluctuation of task_bw is reduced to 1/4. The benefit
is obvious: when there are 1000 concurrent dirtiers, the fluctuations
quickly go out of control; with this patch, the max fluctuations
virtually are the same as the single dirtier case. In this way, the
control system can scale to whatever huge number of dirtiers.
fig.1 before patch
bdi->write_bandwidth ........o
o
o
o
o
o
o
o
o
o
o
o
task_bw = bdi->write_bandwidth / 4 ....................o
|o
| o
| o <= A'
----------------------------------------------------------+---o
A C
fig.2 after patch
task_bw = bdi->throttle_bandwidth ........o
= bdi->write_bandwidth / 4 | o <= B'
| o
| o
----------------------------------------------+---------------o
B C
The added complexity is, it will take some time for
bdi->throttle_bandwidth to adapt to the workload:
- 2 seconds to scale to 10 times more dirtier tasks
- 10 seconds to 10 times less dirtier tasks
The slower adapt time to reduced tasks is not a big problem. Because
the control line is not linear. At worst, bdi_dirty will drop below the
15% throttle threshold where the tasks won't be throttled at all.
When the system has dirtiers of different speed, bdi->throttle_bandwidth
will adapt to around the most fast speed.
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
include/linux/backing-dev.h | 1
mm/backing-dev.c | 1
mm/page-writeback.c | 42 +++++++++++++++++++++++++++++++++-
3 files changed, 43 insertions(+), 1 deletion(-)
--- linux-next.orig/include/linux/backing-dev.h 2010-12-13 21:46:14.000000000 +0800
+++ linux-next/include/linux/backing-dev.h 2010-12-13 21:46:15.000000000 +0800
@@ -78,6 +78,7 @@ struct backing_dev_info {
unsigned long bw_time_stamp;
unsigned long written_stamp;
unsigned long write_bandwidth;
+ unsigned long throttle_bandwidth;
struct prop_local_percpu completions;
int dirty_exceeded;
--- linux-next.orig/mm/page-writeback.c 2010-12-13 21:46:15.000000000 +0800
+++ linux-next/mm/page-writeback.c 2010-12-13 21:46:15.000000000 +0800
@@ -521,6 +521,45 @@ out:
return 1 + int_sqrt(dirty_thresh - dirty_pages);
}
+/*
+ * The bdi throttle bandwidth is introduced for resisting bdi_dirty from
+ * getting too close to task_thresh. It allows scaling up to 1000+ concurrent
+ * dirtier tasks while keeping the fluctuation level flat.
+ */
+static void __bdi_update_throttle_bandwidth(struct backing_dev_info *bdi,
+ unsigned long dirty,
+ unsigned long thresh)
+{
+ unsigned long gap = thresh / TASK_SOFT_DIRTY_LIMIT + 1;
+ unsigned long bw = bdi->throttle_bandwidth;
+
+ if (dirty > thresh)
+ return;
+
+ /* adapt to concurrent dirtiers */
+ if (dirty > thresh - gap) {
+ bw -= bw >> (3 + 4 * (thresh - dirty) / gap);
+ goto out;
+ }
+
+ /* adapt to one single dirtier */
+ if (dirty > thresh - gap * 2 + gap / 4 &&
+ bw > bdi->write_bandwidth + bdi->write_bandwidth / 2) {
+ bw -= bw >> (3 + 4 * (thresh - dirty - gap) / gap);
+ goto out;
+ }
+
+ if (dirty <= thresh - gap * 2 - gap / 2 &&
+ bw < bdi->write_bandwidth - bdi->write_bandwidth / 2) {
+ bw += (bw >> 4) + 1;
+ goto out;
+ }
+
+ return;
+out:
+ bdi->throttle_bandwidth = bw;
+}
+
static void __bdi_update_write_bandwidth(struct backing_dev_info *bdi,
unsigned long elapsed,
unsigned long written)
@@ -563,6 +602,7 @@ void bdi_update_bandwidth(struct backing
goto unlock;
__bdi_update_write_bandwidth(bdi, elapsed, written);
+ __bdi_update_throttle_bandwidth(bdi, bdi_dirty, bdi_thresh);
snapshot:
bdi->written_stamp = written;
@@ -651,7 +691,7 @@ static void balance_dirty_pages(struct a
* close to task_thresh, and help reduce fluctuations of pause
* time when there are lots of dirtiers.
*/
- bw = bdi->write_bandwidth;
+ bw = bdi->throttle_bandwidth;
bw = bw * (bdi_thresh - bdi_dirty);
do_div(bw, bdi_thresh / BDI_SOFT_DIRTY_LIMIT + 1);
--- linux-next.orig/mm/backing-dev.c 2010-12-13 21:46:14.000000000 +0800
+++ linux-next/mm/backing-dev.c 2010-12-13 21:46:15.000000000 +0800
@@ -664,6 +664,7 @@ int bdi_init(struct backing_dev_info *bd
spin_lock_init(&bdi->bw_lock);
bdi->write_bandwidth = 100 << (20 - PAGE_SHIFT); /* 100 MB/s */
+ bdi->throttle_bandwidth = 100 << (20 - PAGE_SHIFT);
bdi->dirty_exceeded = 0;
err = prop_local_init_percpu(&bdi->completions);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-12-13 14:46 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-13 14:46 [PATCH 00/35] IO-less dirty throttling v4 Wu Fengguang
2010-12-13 14:46 ` [PATCH 01/35] writeback: enabling gate limit for light dirtied bdi Wu Fengguang
2011-01-12 21:43 ` Jan Kara
2011-01-13 3:44 ` Wu Fengguang
2011-01-13 3:58 ` Wu Fengguang
2011-01-13 19:26 ` Peter Zijlstra
2011-01-14 3:21 ` Wu Fengguang
2010-12-13 14:46 ` [PATCH 02/35] writeback: safety margin for bdi stat error Wu Fengguang
2011-01-12 21:59 ` Jan Kara
2011-01-13 4:14 ` Wu Fengguang
2011-01-13 10:38 ` Jan Kara
2011-01-13 10:41 ` Wu Fengguang
2010-12-13 14:46 ` [PATCH 03/35] writeback: prevent duplicate balance_dirty_pages_ratelimited() calls Wu Fengguang
2010-12-13 14:46 ` [PATCH 04/35] writeback: reduce per-bdi dirty threshold ramp up time Wu Fengguang
2010-12-14 13:37 ` Richard Kennedy
2010-12-14 13:59 ` Wu Fengguang
2010-12-14 14:33 ` Wu Fengguang
2010-12-14 14:39 ` Wu Fengguang
2010-12-14 14:50 ` Peter Zijlstra
2010-12-14 15:15 ` Wu Fengguang
2010-12-14 15:26 ` Wu Fengguang
2010-12-14 14:56 ` Wu Fengguang
2010-12-15 18:48 ` Richard Kennedy
2010-12-17 13:07 ` Wu Fengguang
2010-12-13 14:46 ` [PATCH 05/35] writeback: IO-less balance_dirty_pages() Wu Fengguang
2010-12-13 14:46 ` [PATCH 06/35] writeback: consolidate variable names in balance_dirty_pages() Wu Fengguang
2010-12-13 14:46 ` [PATCH 07/35] writeback: per-task rate limit on balance_dirty_pages() Wu Fengguang
2010-12-13 14:46 ` [PATCH 08/35] writeback: user space think time compensation Wu Fengguang
2010-12-13 14:46 ` [PATCH 09/35] writeback: account per-bdi accumulated written pages Wu Fengguang
2010-12-13 14:46 ` [PATCH 10/35] writeback: bdi write bandwidth estimation Wu Fengguang
2010-12-13 14:46 ` [PATCH 11/35] writeback: show bdi write bandwidth in debugfs Wu Fengguang
2010-12-13 14:46 ` [PATCH 12/35] writeback: scale down max throttle bandwidth on concurrent dirtiers Wu Fengguang
2010-12-14 1:21 ` Yan, Zheng
2010-12-14 7:00 ` Wu Fengguang
2010-12-14 13:00 ` Wu Fengguang
2010-12-13 14:46 ` Wu Fengguang [this message]
2010-12-13 14:47 ` [PATCH 14/35] writeback: smoothed bdi dirty pages Wu Fengguang
2010-12-13 14:47 ` [PATCH 15/35] writeback: adapt max balance pause time to memory size Wu Fengguang
2010-12-13 14:47 ` [PATCH 16/35] writeback: increase min pause time on concurrent dirtiers Wu Fengguang
2010-12-13 18:23 ` Valdis.Kletnieks
2010-12-14 6:51 ` Wu Fengguang
2010-12-14 18:42 ` Valdis.Kletnieks
2010-12-14 18:55 ` Peter Zijlstra
2010-12-14 20:13 ` Valdis.Kletnieks
2010-12-14 20:24 ` Peter Zijlstra
2010-12-14 20:37 ` Valdis.Kletnieks
2010-12-13 14:47 ` [PATCH 17/35] writeback: quit throttling when bdi dirty pages dropped low Wu Fengguang
2010-12-16 5:17 ` Wu Fengguang
2010-12-13 14:47 ` [PATCH 18/35] writeback: start background writeback earlier Wu Fengguang
2010-12-16 5:37 ` Wu Fengguang
2010-12-13 14:47 ` [PATCH 19/35] writeback: make nr_to_write a per-file limit Wu Fengguang
2010-12-13 14:47 ` [PATCH 20/35] writeback: scale IO chunk size up to device bandwidth Wu Fengguang
2010-12-13 14:47 ` [PATCH 21/35] writeback: trace balance_dirty_pages() Wu Fengguang
2010-12-13 14:47 ` [PATCH 22/35] writeback: trace global dirty page states Wu Fengguang
2010-12-17 2:19 ` Wu Fengguang
2010-12-17 3:11 ` Wu Fengguang
2010-12-17 6:52 ` Hugh Dickins
2010-12-17 9:31 ` Wu Fengguang
2010-12-17 11:21 ` [PATCH] writeback: skip balance_dirty_pages() for in-memory fs Wu Fengguang
2010-12-17 14:21 ` Rik van Riel
2010-12-17 15:34 ` Minchan Kim
2010-12-17 15:42 ` Minchan Kim
2010-12-21 5:59 ` Hugh Dickins
2010-12-21 9:39 ` Wu Fengguang
2010-12-30 3:15 ` Hugh Dickins
2010-12-13 14:47 ` [PATCH 23/35] writeback: trace writeback_single_inode() Wu Fengguang
2010-12-13 14:47 ` [PATCH 24/35] btrfs: dont call balance_dirty_pages_ratelimited() on already dirty pages Wu Fengguang
2010-12-13 14:47 ` [PATCH 25/35] btrfs: lower the dirty balacing rate limit Wu Fengguang
2010-12-13 14:47 ` [PATCH 26/35] btrfs: wait on too many nr_async_bios Wu Fengguang
2010-12-13 14:47 ` [PATCH 27/35] nfs: livelock prevention is now done in VFS Wu Fengguang
2010-12-13 14:47 ` [PATCH 28/35] nfs: writeback pages wait queue Wu Fengguang
2010-12-13 14:47 ` [PATCH 29/35] nfs: in-commit pages accounting and " Wu Fengguang
2010-12-13 21:15 ` Trond Myklebust
2010-12-14 15:40 ` Wu Fengguang
2010-12-14 15:57 ` Trond Myklebust
2010-12-15 15:07 ` Wu Fengguang
2010-12-13 14:47 ` [PATCH 30/35] nfs: heuristics to avoid commit Wu Fengguang
2010-12-13 20:53 ` Trond Myklebust
2010-12-14 8:20 ` Wu Fengguang
2010-12-13 14:47 ` [PATCH 31/35] nfs: dont change wbc->nr_to_write in write_inode() Wu Fengguang
2010-12-13 21:01 ` Trond Myklebust
2010-12-14 15:53 ` Wu Fengguang
2010-12-13 14:47 ` [PATCH 32/35] nfs: limit the range of commits Wu Fengguang
2010-12-13 14:47 ` [PATCH 33/35] nfs: adapt congestion threshold to dirty threshold Wu Fengguang
2010-12-13 14:47 ` [PATCH 34/35] nfs: trace nfs_commit_unstable_pages() Wu Fengguang
2010-12-13 14:47 ` [PATCH 35/35] nfs: trace nfs_commit_release() Wu Fengguang
[not found] ` <AANLkTinFeu7LMaDFgUcP3r2oqVHE5bei3T5JTPGBNvS9@mail.gmail.com>
2010-12-14 4:59 ` [PATCH 00/35] IO-less dirty throttling v4 Wu Fengguang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101213150327.936117931@intel.com \
--to=fengguang.wu@intel.com \
--cc=akpm@linux-foundation.org \
--cc=jack@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).