linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHSET][RFC] Make background writeback not suck
@ 2016-03-22 17:55 Jens Axboe
  2016-03-22 17:55 ` [PATCH 1/6] block: ensure we don't truncate top bits of the request command flags Jens Axboe
                   ` (6 more replies)
  0 siblings, 7 replies; 27+ messages in thread
From: Jens Axboe @ 2016-03-22 17:55 UTC (permalink / raw)
  To: linux-kernel, linux-fsdevel, linux-block

This patchset isn't as much a final solution, as it's demonstration
of what I believe is a huge issue. Since the dawn of time, our
background buffered writeback has sucked. When we do background
buffered writeback, it should have little impact on foreground
activity. That's the definition of background activity... But for as
long as I can remember, heavy buffered writers has not behaved like
that. For instance, if I do something like this:

$ dd if=/dev/zero of=foo bs=1M count=10k

on my laptop, and then try and start chrome, it basically won't start
before the buffered writeback is done. Or for server oriented workloads
where installation of a big RPM (or similar) adversely impacts data
base reads. When that happens, I get people yelling at me.

A quick demonstration - a fio job that reads a a file, while someone
else issues the above 'dd'. Run on a flash device, using XFS. The
vmstat output looks something like this:

--io---- -system-- ------cpu-----
bi    bo   in   cs us sy id wa st
   156  4648   58  151  0  1 98  1  0
     0     0   64   83  0  0 100  0  0
     0    32   76  119  0  0 100  0  0
 26616     0 7574 13907  7  0 91  2  0
 41992     0 10811 21395  0  2 95  3  0
 46040     0 11836 23395  0  3 94  3  0
 19376 1310736 5894 10080  0  4 93  3  0
   116 1974296 1858  455  0  4 93  3  0
   124 2020372 1964  545  0  4 92  4  0
   112 1678356 1955  620  0  3 93  3  0
  8560 405508 3759 4756  0  1 96  3  0
 42496     0 10798 21566  0  0 97  3  0
 42476     0 10788 21524  0  0 97  3  0

The read starts out fine, but goes to shit when we start bacckground
flushing. The reader experiences latency spikes in the seconds range.
On flash.

With this set of patches applies, the situation looks like this instead:

--io---- -system-- ------cpu-----
bi    bo   in   cs us sy id wa st
 33544     0 8650 17204  0  1 97  2  0
 42488     0 10856 21756  0  0 97  3  0
 42032     0 10719 21384  0  0 97  3  0
 42544    12 10838 21631  0  0 97  3  0
 42620     0 10982 21727  0  3 95  3  0
 46392     0 11923 23597  0  3 94  3  0
 36268 512000 9907 20044  0  3 91  5  0
 31572 696324 8840 18248  0  1 91  7  0
 30748 626692 8617 17636  0  2 91  6  0
 31016 618504 8679 17736  0  3 91  6  0
 30612 648196 8625 17624  0  3 91  6  0
 30992 650296 8738 17859  0  3 91  6  0
 30680 604075 8614 17605  0  3 92  6  0
 30592 595040 8572 17564  0  2 92  6  0
 31836 539656 8819 17962  0  2 92  5  0

and the reader never sees latency spikes above a few miliseconds.

The above was the why. The how is basically throttling background
writeback. We still want to issue big writes from the vm side of things,
so we get nice and big extents on the file system end. But we don't need
to flood the device with THOUSANDS of requests for background writeback.
For most devices, we don't need a whole lot to get decent throughput.

This adds some simple blk-wb code that keeps limits how much buffered
writeback we keep in flight on the device end. The default is pretty
low. If we end up switching to WB_SYNC_ALL, we up the limits. If the
dirtying task ends up being throttled in balance_dirty_pages(), we up
the limit. Currently there are tunables associated with this, see the
last patch for descriptions of those.

I welcome testing. The end goal here would be having much of this
auto-tuned, so that we don't lose substantial bandwidth for background
writes, while still maintaining decent non-wb performance and latencies.

You can also find this in a branch in the block git repo:

git://git.kernel.dk/linux-block.git wb-buf-throttle

Note that I rebase this branch when I collapse patches. Patches are
against current Linus' git, 4.5.0+.

 block/Makefile                   |    2 
 block/blk-core.c                 |   21 +++
 block/blk-lib.c                  |    1 
 block/blk-mq.c                   |   32 +++++
 block/blk-settings.c             |   11 +
 block/blk-sysfs.c                |  123 +++++++++++++++++++++
 block/blk-wb.c                   |  219 +++++++++++++++++++++++++++++++++++++++
 block/blk-wb.h                   |   24 ++++
 block/cfq-iosched.c              |    2 
 block/elevator.c                 |    6 -
 drivers/nvme/host/core.c         |    1 
 drivers/scsi/sd.c                |    5 
 fs/fs-writeback.c                |    5 
 include/linux/backing-dev-defs.h |    2 
 include/linux/blk_types.h        |    2 
 include/linux/blkdev.h           |    9 +
 include/linux/elevator.h         |    4 
 mm/page-writeback.c              |    2 
 18 files changed, 456 insertions(+), 15 deletions(-)


-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2016-03-25  4:19 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-22 17:55 [PATCHSET][RFC] Make background writeback not suck Jens Axboe
2016-03-22 17:55 ` [PATCH 1/6] block: ensure we don't truncate top bits of the request command flags Jens Axboe
2016-03-22 18:59   ` Christoph Hellwig
2016-03-22 19:01     ` Jens Axboe
2016-03-25  2:08       ` Mike Christie
2016-03-25  4:18         ` Jens Axboe
2016-03-22 17:55 ` [PATCH 2/6] writeback: wb_start_writeback() should use WB_SYNC_ALL for WB_REASON_SYNC Jens Axboe
2016-03-22 21:34   ` Dave Chinner
2016-03-22 21:40     ` Jens Axboe
2016-03-22 21:51       ` Jens Axboe
2016-03-22 22:04       ` Dave Chinner
2016-03-22 22:07         ` Jens Axboe
2016-03-22 17:55 ` [PATCH 3/6] block: add ability to flag write back caching on a device Jens Axboe
2016-03-22 18:57   ` Christoph Hellwig
2016-03-22 18:59     ` Jens Axboe
2016-03-22 17:55 ` [PATCH 4/6] sd: inform block layer of write cache state Jens Axboe
2016-03-22 17:55 ` [PATCH 5/6] NVMe: " Jens Axboe
2016-03-22 17:55 ` [PATCH 6/6] writeback: throttle buffered writeback Jens Axboe
2016-03-22 20:12   ` Jeff Moyer
2016-03-22 20:19     ` Jens Axboe
2016-03-22 20:27       ` Jeff Moyer
2016-03-22 21:30       ` Shaohua Li
2016-03-22 21:35         ` Jens Axboe
2016-03-22 21:51 ` [PATCHSET][RFC] Make background writeback not suck Dave Chinner
2016-03-22 22:03   ` Jens Axboe
2016-03-22 22:31     ` Dave Chinner
2016-03-22 22:57       ` Jens Axboe

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).