From: Andrea Righi <andrea@betterlinux.com>
To: Vivek Goyal <vgoyal@redhat.com>
Cc: linux-kernel@vger.kernel.org, jaxboe@fusionio.com,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 8/8] blk-throttle: enable throttling of task while dirtying pages
Date: Thu, 30 Jun 2011 17:06:08 +0200 [thread overview]
Message-ID: <20110630150608.GA2068@thinkpad> (raw)
In-Reply-To: <20110630145229.GA1655@thinkpad>
On Thu, Jun 30, 2011 at 04:52:29PM +0200, Andrea Righi wrote:
> On Tue, Jun 28, 2011 at 11:35:09AM -0400, Vivek Goyal wrote:
> > Put the blk_throtl_dirty_pages() hook in
> > balance_dirty_pages_ratelimited_nr() to enable task throttling.
> >
> > Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
> > ---
> > include/linux/blkdev.h | 5 +++++
> > mm/page-writeback.c | 3 +++
> > 2 files changed, 8 insertions(+), 0 deletions(-)
> >
> > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> > index 4ce6e68..5d4a57e 100644
> > --- a/include/linux/blkdev.h
> > +++ b/include/linux/blkdev.h
> > @@ -1180,12 +1180,17 @@ static inline uint64_t rq_io_start_time_ns(struct request *req)
> > extern int blk_throtl_init(struct request_queue *q);
> > extern void blk_throtl_exit(struct request_queue *q);
> > extern int blk_throtl_bio(struct request_queue *q, struct bio **bio);
> > +extern void blk_throtl_dirty_pages(struct address_space *mapping,
> > + unsigned long nr_dirty);
> > #else /* CONFIG_BLK_DEV_THROTTLING */
> > static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio)
> > {
> > return 0;
> > }
> >
> > +static inline void blk_throtl_dirty_pages(struct address_space *mapping,
> > + unsigned long nr_dirty) {}
> > +
> > static inline int blk_throtl_init(struct request_queue *q) { return 0; }
> > static inline int blk_throtl_exit(struct request_queue *q) { return 0; }
> > #endif /* CONFIG_BLK_DEV_THROTTLING */
> > diff --git a/mm/page-writeback.c b/mm/page-writeback.c
> > index 31f6988..943e551 100644
> > --- a/mm/page-writeback.c
> > +++ b/mm/page-writeback.c
> > @@ -629,6 +629,9 @@ void balance_dirty_pages_ratelimited_nr(struct address_space *mapping,
> > unsigned long ratelimit;
> > unsigned long *p;
> >
> > + /* Subject writes to IO controller throttling */
> > + blk_throtl_dirty_pages(mapping, nr_pages_dirtied);
> > +
>
> mmmh.. in this way we throttle also tasks that are re-writing dirty pages
> multiple times.
>
> From the controller perspective what is actually generating I/O on block
> devices is the generation of _new_ dirty pages. Multiple re-writes in page
> cache should never be throttled IMHO.
>
> I would re-write this patch in the following way. What do you think?
>
> Thanks,
> -Andrea
>
> ---
> Subject: [PATCH 8/8] blk-throttle: enable throttling of task while dirtying pages
>
> From: Andrea Righi <andrea@betterlinux.com>
>
> Put the blk_throtl_dirty_pages() hook in balance_dirty_pages_ratelimited_nr()
> to enable task throttling.
>
> Moreover, modify balance_dirty_pages_ratelimited_nr() to accept the additional
> parameter "redirty". This parameter can be used to notify if the pages have
> been dirtied for the first time or re-dirtied.
>
> This information can be used by the blkio.throttle controller to distinguish
> between a WRITE in the page cache, that will eventually generates I/O activity
> on block device by the writeback code, and a re-WRITE operation that most of
> the time will not generate additional I/O activity.
>
> This means that a task that re-writes multiple times the same blocks of a file
> is affected by the blkio limitations only for the actual I/O that will be
> performed to the underlying block devices during the writeback process.
>
> Signed-off-by: Andrea Righi <andrea@betterlinux.com>
> Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
A simple test (see rewrite.c below):
# echo 8:0 1000000 > /sys/fs/cgroup/blkio/foo/blkio.throttle.write_bps_device
- before:
$ ./rewrite
0: 4s <-- first write
1: 4s \
2: 4s |
3: 5s |
4: 4s |
5: 4s | <-- re-writes (not generating additional I/O)
6: 4s |
7: 4s |
8: 5s |
9: 4s /
- after:
$ ./rewrite
0: 4s <-- first write
1: 0s \
2: 0s |
3: 0s |
4: 0s |
5: 0s | <-- re-writes (not generating additional I/O)
6: 0s |
7: 0s |
8: 0s |
9: 0s /
-Andrea
---
/*
* rewrite.c
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <sys/types.h>
static char buf[4 * 1024 * 1024];
int main(int argc, char **argv)
{
int fd, i;
fd = open("junk", O_WRONLY | O_CREAT, 0600);
if (fd < 0) {
perror("open");
exit(1);
}
for (i = 0; i < 10; i++) {
time_t start, end;
lseek(fd, 0, SEEK_SET);
start = time(NULL);
if (write(fd, buf, sizeof(buf)) < 0) {
perror("write");
exit(1);
}
end = time(NULL);
printf("%d: %zus\n", i, end - start);
fflush(stdout);
}
unlink("junk");
return 0;
}
next prev parent reply other threads:[~2011-06-30 15:06 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-28 15:35 [PATCH 0/8][V2] blk-throttle: Throttle buffered WRITEs in balance_dirty_pages() Vivek Goyal
2011-06-28 15:35 ` [PATCH 1/8] blk-throttle: convert wait routines to return jiffies to wait Vivek Goyal
2011-06-28 15:35 ` [PATCH 2/8] blk-throttle: do not enforce first queued bio check in tg_wait_dispatch Vivek Goyal
2011-06-28 15:35 ` [PATCH 3/8] blk-throttle: use io size and direction as parameters to wait routines Vivek Goyal
2011-06-28 15:35 ` [PATCH 4/8] blk-throttle: specify number of ios during dispatch update Vivek Goyal
2011-06-28 15:35 ` [PATCH 5/8] blk-throttle: get rid of extend slice trace message Vivek Goyal
2011-06-28 15:35 ` [PATCH 6/8] blk-throttle: core logic to throttle task while dirtying pages Vivek Goyal
2011-06-29 9:30 ` Andrea Righi
2011-06-29 15:25 ` Andrea Righi
2011-06-29 20:03 ` Vivek Goyal
2011-06-28 15:35 ` [PATCH 7/8] blk-throttle: do not throttle writes at device level except direct io Vivek Goyal
2011-06-28 15:35 ` [PATCH 8/8] blk-throttle: enable throttling of task while dirtying pages Vivek Goyal
2011-06-30 14:52 ` Andrea Righi
2011-06-30 15:06 ` Andrea Righi [this message]
2011-06-30 17:14 ` Vivek Goyal
2011-06-30 21:22 ` Andrea Righi
2011-06-28 16:21 ` [PATCH 0/8][V2] blk-throttle: Throttle buffered WRITEs in balance_dirty_pages() Andrea Righi
2011-06-28 17:06 ` Vivek Goyal
2011-06-28 17:39 ` Andrea Righi
2011-06-29 16:05 ` Andrea Righi
2011-06-29 20:04 ` Vivek Goyal
2011-06-29 0:42 ` Dave Chinner
2011-06-29 1:53 ` Vivek Goyal
2011-06-30 20:04 ` fsync serialization on ext4 with blkio throttling (Was: Re: [PATCH 0/8][V2] blk-throttle: Throttle buffered WRITEs in balance_dirty_pages()) Vivek Goyal
2011-06-30 20:44 ` Vivek Goyal
2011-07-01 0:16 ` Dave Chinner
-- strict thread matches above, loose matches on Subject: below --
2011-06-03 21:06 [RFC PATCH 0/8] blk-throttle: Throttle buffered WRITE in balance_dirty_pages() Vivek Goyal
2011-06-03 21:06 ` [PATCH 8/8] blk-throttle: enable throttling of task while dirtying pages Vivek Goyal
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=20110630150608.GA2068@thinkpad \
--to=andrea@betterlinux.com \
--cc=jaxboe@fusionio.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vgoyal@redhat.com \
/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).