Thread (13 messages) 13 messages, 7 authors, 2012-08-22

Re: O_DIRECT to md raid 6 is slow

From: NeilBrown <hidden>
Date: 2012-08-20 00:02:08
Also in: lkml

On Sun, 19 Aug 2012 18:34:28 -0500 Stan Hoeppner [off-list ref]
wrote:
On 8/19/2012 9:01 AM, David Brown wrote:
quoted
I'm sort of jumping in to this thread, so my apologies if I repeat
things other people have said already.
I'm glad you jumped in David.  You made a critical statement of fact
below which clears some things up.  If you had stated it early on,
before Miquel stole the thread and moved it to LKML proper, it would
have short circuited a lot of this discussion.  Which is:
quoted
AFAIK, there is scope for a few performance optimisations in raid6.  One
is that for small writes which only need to change one block, raid5 uses
a "short-cut" RMW cycle (read the old data block, read the old parity
block, calculate the new parity block, write the new data and parity
blocks).  A similar short-cut could be implemented in raid6, though it
is not clear how much a difference it would really make.
Thus my original statement was correct, or at least half correct[1], as
it pertained to md/RAID6.  Then Miquel switched the discussion to
md/RAID5 and stated I was all wet.  I wasn't, and neither was Dave
Chinner.  I was simply unaware of this md/RAID5 single block write RMW
shortcut.  I'm copying lkml proper on this simply to set the record
straight.  Not that anyone was paying attention, but it needs to be in
the same thread in the archives.  The takeaway:
Since we are trying to set the record straight....
md/RAID6 must read all devices in a RMW cycle.
md/RAID6 must read all data devices (i.e. not parity devices) which it is not
going to write to, in an RWM cycle (which the code actually calls RCW -
reconstruct-write).
md/RAID5 takes a shortcut for single block writes, and must only read
one drive for the RMW cycle.
md/RAID5 uses an alternate mechanism when the number of data blocks that need
to be written is less than half the number of data blocks in a stripe.  In
this alternate mechansim (which the code calls RMW - read-modify-write),
md/RAID5 reads all the blocks that it is about to write to, plus the parity
block.  It then computes the new parity and writes it out along with the new
data.
[1}The only thing that's not clear at this point is if md/RAID6 also
always writes back all chunks during RMW, or only the chunk that has
changed.
Do you seriously imagine anyone would write code to write out data which it
is known has not changed?  Sad. :-)

NeilBrown

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help