NeilBrown: Set default bitmap-chunksize for internal bitmaps to at least 64Meg

Martin F. Krafft madduck at alioth.debian.org
Wed Jan 27 02:03:33 UTC 2010


Module: mdadm
Branch: upstream
Commit: b8ab2a50aba72c7316d92d0fb414167844673136
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=b8ab2a50aba72c7316d92d0fb414167844673136

Author: NeilBrown <neilb at suse.de>
Date:   Tue Nov 17 13:15:34 2009 +1100

Set default bitmap-chunksize for internal bitmaps to at least 64Meg

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 at suse.de>

---

 mdadm.8                       |    4 ++--
 super0.c                      |    9 +++++++--
 super1.c                      |    9 +++++++--
 tests/05r1-grow-internal      |    2 +-
 tests/05r1-grow-internal-1    |    2 +-
 tests/05r1-internalbitmap     |    2 +-
 tests/05r1-internalbitmap-v1a |    2 +-
 tests/05r1-internalbitmap-v1b |    2 +-
 tests/05r1-internalbitmap-v1c |    2 +-
 tests/05r1-re-add             |    2 +-
 tests/05r5-internalbitmap     |    2 +-
 tests/06update-uuid           |    4 ++--
 tests/06wrmostly              |    2 +-
 13 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/mdadm.8 b/mdadm.8
index fb20383..3b6ffa0 100644
--- 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
diff --git a/super0.c b/super0.c
index f9e6a6d..955e832 100644
--- 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);
diff --git a/super1.c b/super1.c
index a21e7e3..8678e9f 100644
--- 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;
diff --git a/tests/05r1-grow-internal b/tests/05r1-grow-internal
index 6389562..f5c0e5b 100644
--- a/tests/05r1-grow-internal
+++ b/tests/05r1-grow-internal
@@ -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'`
diff --git a/tests/05r1-grow-internal-1 b/tests/05r1-grow-internal-1
index 18c5c8b..7539fad 100644
--- a/tests/05r1-grow-internal-1
+++ b/tests/05r1-grow-internal-1
@@ -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'`
diff --git a/tests/05r1-internalbitmap b/tests/05r1-internalbitmap
index 0af4a7a..68d65e4 100644
--- a/tests/05r1-internalbitmap
+++ b/tests/05r1-internalbitmap
@@ -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
diff --git a/tests/05r1-internalbitmap-v1a b/tests/05r1-internalbitmap-v1a
index 2ef5eba..f9b08e8 100644
--- a/tests/05r1-internalbitmap-v1a
+++ b/tests/05r1-internalbitmap-v1a
@@ -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
diff --git a/tests/05r1-internalbitmap-v1b b/tests/05r1-internalbitmap-v1b
index 509fb28..268de57 100644
--- a/tests/05r1-internalbitmap-v1b
+++ b/tests/05r1-internalbitmap-v1b
@@ -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
diff --git a/tests/05r1-internalbitmap-v1c b/tests/05r1-internalbitmap-v1c
index 5fea930..9eb9a45 100644
--- a/tests/05r1-internalbitmap-v1c
+++ b/tests/05r1-internalbitmap-v1c
@@ -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
diff --git a/tests/05r1-re-add b/tests/05r1-re-add
index 97db6c5..cfa1e6b 100644
--- a/tests/05r1-re-add
+++ b/tests/05r1-re-add
@@ -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
diff --git a/tests/05r5-internalbitmap b/tests/05r5-internalbitmap
index 50dd36e..591c9db 100644
--- a/tests/05r5-internalbitmap
+++ b/tests/05r5-internalbitmap
@@ -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
diff --git a/tests/06update-uuid b/tests/06update-uuid
index c23afc9..a4409e7 100644
--- a/tests/06update-uuid
+++ b/tests/06update-uuid
@@ -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
diff --git a/tests/06wrmostly b/tests/06wrmostly
index a4d730e..2a3fae6 100644
--- a/tests/06wrmostly
+++ b/tests/06wrmostly
@@ -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
 




More information about the pkg-mdadm-commits mailing list