]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Set default bitmap-chunksize for internal bitmaps to at least 64Meg
authorNeilBrown <neilb@suse.de>
Tue, 17 Nov 2009 02:15:34 +0000 (13:15 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 17 Nov 2009 02:15:34 +0000 (13:15 +1100)
A small bitmap-chunksize hurts performance without helping
resync speed much - particularly on internal bitmaps.

So set the default to at least 64Meg.

Signed-off-by: NeilBrown <neilb@suse.de>
13 files changed:
mdadm.8
super0.c
super1.c
tests/05r1-grow-internal
tests/05r1-grow-internal-1
tests/05r1-internalbitmap
tests/05r1-internalbitmap-v1a
tests/05r1-internalbitmap-v1b
tests/05r1-internalbitmap-v1c
tests/05r1-re-add
tests/05r5-internalbitmap
tests/06update-uuid
tests/06wrmostly

diff --git a/mdadm.8 b/mdadm.8
index fb20383a2af65b778da3653ff1b14cbd32cbe320..3b6ffa041b0f83f0dcd95e455194d0bc7c249602 100644 (file)
--- a/mdadm.8
+++ b/mdadm.8
@@ -614,8 +614,8 @@ When using a file based bitmap, the default is to use the smallest
 size that is at-least 4 and requires no more than 2^21 chunks.
 When using an
 .B internal
-bitmap, the chunksize is automatically determined to make best use of
-available space.
+bitmap, the chunksize defaults to 64Meg, or larger if necessary to
+fit the bitmap into the available space.
 
 .TP
 .BR \-W ", " \-\-write\-mostly
index f9e6a6db262135476cfed766f15bd0f4ec360847..955e832dbb977d432f4fbf90c619a2dbb171707d 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -970,9 +970,14 @@ static int add_internal_bitmap0(struct supertype *st, int *chunkp,
                min_chunk *= 2;
                bits = (bits+1)/2;
        }
-       if (chunk == UnSet)
+       if (chunk == UnSet) {
+               /* A chunk size less than a few Megabytes gives poor
+                * performance without increasing resync noticeably
+                */
                chunk = min_chunk;
-       else if (chunk < min_chunk)
+               if (chunk < 64*1024*1024)
+                       chunk = 64*1024*1024;
+       } else if (chunk < min_chunk)
                return 0; /* chunk size too small */
 
        sb->state |= (1<<MD_SB_BITMAP_PRESENT);
index a21e7e3baf8eeeeaf8b9f6a71ed6a833937e846e..8678e9f421b9f45eebaf60849729acf471ad7039 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -1501,9 +1501,14 @@ add_internal_bitmap1(struct supertype *st,
                min_chunk *= 2;
                bits = (bits+1)/2;
        }
-       if (chunk == UnSet)
+       if (chunk == UnSet) {
+               /* For practical purpose, 64Meg is a good
+                * default chunk size for internal bitmaps.
+                */
                chunk = min_chunk;
-       else if (chunk < min_chunk)
+               if (chunk < 64*1024*1024)
+                       chunk = 64*1024*1024;
+       } else if (chunk < min_chunk)
                return 0; /* chunk size too small */
        if (chunk == 0) /* rounding problem */
                return 0;
index 6389562f1320125d33854556f8b96367584c478a..f5c0e5b3f31a0e73a6515088578c249de29288e4 100644 (file)
@@ -7,7 +7,7 @@ check wait
 testdev $md0 1 $mdsize1 1
 
 #mdadm -E $dev1
-mdadm --grow $md0 --bitmap=internal --delay=1 || { mdadm -X $dev2 ; exit 1; }
+mdadm --grow $md0 --bitmap=internal --bitmap-chunk=4 --delay=1 || { mdadm -X $dev2 ; exit 1; }
 dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
 sleep 4
 dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
index 18c5c8b120da038e1559be01a1b85cd987f58d8d..7539fadf602702b4dbe5a15a16bba3896ce287d9 100644 (file)
@@ -7,7 +7,7 @@ check wait
 testdev $md0 1 $mdsize1b 1
 
 #mdadm -E $dev1
-mdadm --grow $md0 --bitmap=internal --delay=1
+mdadm --grow $md0 --bitmap=internal --bitmap-chunk=4 --delay=1
 dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
 sleep 4
 dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
index 0af4a7a86ab29e1407338c42e1eb0008977345f0..68d65e428aa0c53f150d0e9c3f9fdf34f41a7b08 100644 (file)
@@ -2,7 +2,7 @@
 # 
 # create a raid1 with an internal bitmap
 #
-mdadm --create -e0.90 --run $md0 --level=1 -n2 --delay=1  --bitmap internal $dev1 $dev2  
+mdadm --create -e0.90 --run $md0 --level=1 -n2 --delay=1  --bitmap internal --bitmap-chunk=4 $dev1 $dev2  
 check wait
 testdev $md0 1 $mdsize0 1
 mdadm -S $md0
index 2ef5ebaee85c6be37f1a0555ce16fa0cbefc45ad..f9b08e8c94012b1525f272db3d5f8d9a75763f04 100644 (file)
@@ -2,7 +2,7 @@
 # 
 # create a raid1 with an internal bitmap
 #
-mdadm --create --run $md0 --metadata=1.0 --level=1 -n2 --delay=1  --bitmap internal $dev1 $dev2  
+mdadm --create --run $md0 --metadata=1.0 --level=1 -n2 --delay=1  --bitmap internal --bitmap-chunk=4 $dev1 $dev2  
 check wait
 check bitmap
 testdev $md0 1 $mdsize1b 1
index 509fb2899ac531f60eb03545f0082fdb00092ea9..268de57ec6651fe07b661f94b871eb5bf56689bc 100644 (file)
@@ -2,7 +2,7 @@
 # 
 # create a raid1 with an internal bitmap
 #
-mdadm --create --run $md0 --metadata=1.1 --level=1 -n2 --delay=1  --bitmap internal $dev1 $dev2  
+mdadm --create --run $md0 --metadata=1.1 --level=1 -n2 --delay=1  --bitmap internal --bitmap-chunk=4 $dev1 $dev2  
 check wait
 check bitmap
 testdev $md0 1 $mdsize11 1
index 5fea930657742bb240aec213c0a1a8c00db1080b..9eb9a45427da9c48578eb6c9e0c81c91d6300c0b 100644 (file)
@@ -2,7 +2,7 @@
 # 
 # create a raid1 with an internal bitmap
 #
-mdadm --create --run $md0 --metadata=1.2 --level=1 -n2 --delay=1  --bitmap internal $dev1 $dev2  
+mdadm --create --run $md0 --metadata=1.2 --level=1 -n2 --delay=1  --bitmap internal --bitmap-chunk 4 $dev1 $dev2  
 check wait
 check bitmap
 testdev $md0 1 $mdsize12 1
index 97db6c5a60b4ef1bed047b00e464907b731a176c..cfa1e6b9fb519c55da1ef45194234173462f1d97 100644 (file)
@@ -5,7 +5,7 @@
 # Then do some IO first.  Resync should still be very fast
 #
 
-mdadm -CR $md0 -l1 -n2 -binternal -d1 $dev1 $dev2
+mdadm -CR $md0 -l1 -n2 -binternal --bitmap-chunk=4 -d1 $dev1 $dev2
 check resync
 check wait
 testdev $md0 1 $mdsize1 1
index 50dd36ead6f53f3362eb3bd3dbe59f8f2f6d5b6c..591c9dbf1e7e4205fd8ccf3be8819ce627e137b3 100644 (file)
@@ -2,7 +2,7 @@
 #
 # create a raid1 with an internal bitmap
 #
-mdadm --create --run $md0 --level=5 -n3 --delay=1  --bitmap internal $dev1 $dev2 $dev3
+mdadm --create --run $md0 --level=5 -n3 --delay=1  --bitmap internal --bitmap-chunk=4 $dev1 $dev2 $dev3
 check wait
 testdev $md0 2 $mdsize1 512
 mdadm -S $md0
index c23afc9fcf364b12fd257aa0d9d3b14a8ea3627e..a4409e7895ea052abe79fc35a03090224d4df88e 100644 (file)
@@ -57,7 +57,7 @@ fi
 mdadm -S /dev/md0
 
 # Internal bitmaps too.
-mdadm -CR --assume-clean  -b internal $md0 -l5 -n3 $dev0 $dev1 $dev2
+mdadm -CR --assume-clean  -b internal --bitmap-chunk 4 $md0 -l5 -n3 $dev0 $dev1 $dev2
 mdadm -S /dev/md0
 mdadm -A /dev/md0 --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
 no_errors
@@ -69,7 +69,7 @@ mdadm -X $dev0 | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 || {
 }
 mdadm -S /dev/md0
 
-mdadm -CR --assume-clean -e1.2 -b internal $md0 -l5 -n3 $dev0 $dev1 $dev2
+mdadm -CR --assume-clean -e1.2 -b internal --bitmap-chunk=4 $md0 -l5 -n3 $dev0 $dev1 $dev2
 mdadm -S /dev/md0
 mdadm -A /dev/md0 --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
 no_errors
index a4d730e8cc8150095267f9c123a0dc0b8619d27a..2a3fae6453c7358c9f7e19adfe2357a9c8e6a5db 100644 (file)
@@ -8,7 +8,7 @@ testdev $md0 1 $mdsize1 1
 
 mdadm -S $md0
 
-mdadm -CR $md0 -l1 -n3 --write-behind --bitmap=internal $dev0 $dev1 --write-mostly $dev2
+mdadm -CR $md0 -l1 -n3 --write-behind --bitmap=internal --bitmap-chunk=4 $dev0 $dev1 --write-mostly $dev2
 testdev $md0 1 $mdsize1 1
 mdadm -S $md0