tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

RAIDframe parity logging



I have been intrigued by the performance numbers from the CMU
parity logging paper for a while now:
        http://www.pdl.cmu.edu/PDL-FTP/ParityLogging/ISCA93.pdf
Essentially, they claim RAID1-like performance for small writes
with RAID5-like storage efficiency.  The numbers in the paper were
generated with code related to our in-kernel RAIDframe.

Our parity logging code doesn't, however, work.  The first obvious
problem is massive memory overallocation -- far, far too much space
for the log.  This fixes it, and also a related problem where an
unpredictable number of log regions are allocated (I'm not sure how
serious that is).  The next problem is that parity initialization
fails with "can't verify parity".  Anyone want to have a shot at
that one?

Index: rf_optnames.h
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_optnames.h,v
retrieving revision 1.11
diff -u -r1.11 rf_optnames.h
--- rf_optnames.h       11 Dec 2005 12:23:37 -0000      1.11
+++ rf_optnames.h       7 Aug 2009 15:57:39 -0000
@@ -82,7 +82,7 @@
 
 #if RF_INCLUDE_PARITYLOGGING > 0
 RF_DBG_OPTION(forceParityLogReint, 0)
-RF_DBG_OPTION(numParityRegions, 0)     /* number of regions in the array */
+RF_DBG_OPTION(numParityRegions, 64)    /* number of regions in the array */
 RF_DBG_OPTION(numReintegrationThreads, 1)
 RF_DBG_OPTION(parityLogDebug, 0)       /* if nonzero, enables debugging of
                                         * parity logging */
Index: rf_paritylogging.c
===================================================================
RCS file: /cvsroot/src/sys/dev/raidframe/rf_paritylogging.c,v
retrieving revision 1.28
diff -u -r1.28 rf_paritylogging.c
--- rf_paritylogging.c  4 Mar 2007 06:02:39 -0000       1.28
+++ rf_paritylogging.c  7 Aug 2009 15:57:40 -0000
@@ -159,7 +159,7 @@
         *
         */
 
-       totalLogCapacity = layoutPtr->stripeUnitsPerDisk * 
layoutPtr->sectorsPerStripeUnit * layoutPtr->numParityLogCol;
+       totalLogCapacity = layoutPtr->stripeUnitsPerDisk /* * 
layoutPtr->sectorsPerStripeUnit */ * layoutPtr->numParityLogCol;
        raidPtr->regionLogCapacity = totalLogCapacity / rf_numParityRegions;
        if (rf_parityLogDebug)
                printf("bytes per sector %d\n", raidPtr->bytesPerSector);


Home | Main Index | Thread Index | Old Index