On Thu, 2008-08-21 at 18:53 +1000, Dave Chinner wrote:
> On Thu, Aug 21, 2008 at 05:00:39PM +1000, Nick Piggin wrote:
> > On Thursday 21 August 2008 16:14, Dave Chinner wrote:
> > > I think that we need to issue explicit unplugs to get the log I/O
> > > dispatched the way we want on all elevators and stop trying to
> > > give elevators implicit hints by abusing the bio types and hoping
> > > they do the right thing....
> > FWIW, my explicit plugging idea is still hanging around in one of
> > Jens' block trees (actually he refreshed it a couple of months ago).
> > It provides an API for VM or filesystems to plug and unplug
> > requests coming out of the current process, and it can reduce the
> > need to idle the queue. Needs more performance analysis and tuning
> > though.
> We've already got plenty of explicit unplugs in XFS to get stuff
> moving quickly - I'll just have to add another....
I did some compilebench runs with xfs this morning, creating 30 kernel
trees on the same machine I posted btrfs and xfs numbers with last week.
Btrfs gets between 60 and 75MB/s average depending on the mount options
used, ext4 gets around 60MB/s
This is a single sata drive that can run at 100MB/s streaming writes.
The numbers show XFS is largely log bound, and that turning off barriers
makes a huge difference. I'd be happy to try another run with explicit
unplugging somewhere in the transaction commit path.
I think the most relevant number is the count of MB written at the end
of blkparse. I'm not sure why the 4ag XFS writes less, but the numbers
do include calling sync at the end. None of the filesystems were doing
barriers in these numbers:
Btrfs metadata dup 9190MiB
Btrfs metadata dup no inline files 10280MiB
XFS 4ag, nobarrier 14299MiB
XFS 1ag, nobarrier 17836MiB
This is a long way of saying the xfs log isn't optimal for these kinds
of operations, which isn't really news. I'm not ripping on xfs here,
this is just one tiny benchmark.
I uploaded some graphs of the IO here:
*** 4ag, 128m log, logbsize=256k
intial create total runs 30 avg 7.48 MB/s (user 0.52s sys 1.04s)
*** 4ag, 128m log, logbsize=256k, nobarrier
intial create total runs 30 avg 21.58 MB/s (user 0.51s sys 1.04s)
*** 1ag, 128m log, logbsize=256k, nobarrier
intial create total runs 30 avg 26.28 MB/s (user 0.50s sys 1.15s)
It is hard to see in the graph, but it looks like the log is in the
first 128MB of the drive. If we give XFS an external log device:
*** 1ag 128m external log, logbsize=256k, nobarrier
intial create total runs 30 avg 38.44 MB/s (user 0.51s sys 1.09s)
This graph shows that log is running more or less seek free between
30-60MB/s for the whole run. I'd expect the explicit unplugging to help
the most in this config?
Here is the main disk during the run:
*** 1ag 128m external log, logbsize=256k, nobarrier, deadline
intial create total runs 30 avg 34.00 MB/s (user 0.51s sys 1.07s)
Deadline didn't help on this box.