Re: RAID6 - RMW logic
From: NeilBrown <hidden>
Date: 2014-07-30 21:30:07
On Wed, 30 Jul 2014 20:24:30 +0000 Markus Stockhausen [off-list ref] wrote:
Hi, the last days I tried to understand the RAID6 logic when recalculating P/Q parity (or syndrome) if only parts of a stripe are updated. As far as I get the current implementation right it will always read the whole stripe and build parities from scratch. E.g. updating a single chunk on a 10 disk RAID6 will read the other 7 data blocks to write the block plus 2 P/Q parities afterwards. Compared to the best case 3 read plus 3 write operations this can be quite a heavy impact. RAID5 at least has a shortcut for that. Being no specialist at all - but having some ideas - I would like to get some feedback about the following way to improve the scenario. 1) Write a modified gen_syndrome function (call it xor_syndrome) like in lib/raid6/xxx.c that allows to XOR an existing P/Q parity without overwriting it. The cost of that function would be the same as it only changes a few assembler commands. 2) Enhance the ops_run_prexor to call this xor_syndrome function for an RAID6. Fill the not relevant pages (R5_wantdrain) with an empty page or NULL. So the gen_syndrome will only find zeroes. With this call P/Q will have a pre-xored version. 3) Enhance ops_run_reconstruct6 to allow processing of changed blocks only. We will call xor_snydrome from there too, to XOR the prexored P/Q once again. 4) Enhance handle_stripe_dirtying so it will allow calculation of RCW versus RMW costs for the RAID6 case. Did I miss something? And if not: Will the doubled CPU consumption for P/Q calculation justify that way of implementation? At least we can avoid IOs on slow disks. Maybe it has been discussed before but I did not find it on the mailing list. Thanks in advance. Markus
Please see http://comments.gmane.org/gmane.linux.raid/42559 Yes, this is something we probably want. The previous effort stalled somehow. Maybe it just needs someone to start pushing again. NeilBrown
Attachments
- signature.asc [application/pgp-signature] 828 bytes