Whamcloud - gitweb
LU-12158 mke2fs: avoid too large stride and stripe_width
authorWang Shilong <wshilong@ddn.com>
Tue, 21 May 2019 04:06:39 +0000 (12:06 +0800)
committerLi Dongyang <dongyangli@ddn.com>
Tue, 11 Jun 2019 03:04:41 +0000 (13:04 +1000)
According to benchmarks numbers, too large stripe and stripe_width
will make preassure with ext4 mballoc allocater and hurts performances
finally.
                    2MB Chunk size                 256K Chunk size
stripe_width,stride     Write(MB/s)    Read(MB/s)   Write(MB/s) Read(MB/s)
512,512                 10,810         10,124       10,492      6,923
1024,1024               10,793         10,064       10,431      6,921
2048,2048               8,047          10,080       6,629       7,381
4096,4096               7,350          10,089       6,505       7,282

Performance number comes from Shuichi Ihara.

This patch try to avoid use too large stride and stripe_width when mkfs.
If users really want large value they could do it by specify mkfs options
or run tune2fs later.

Change-Id: I768f1ecb39837338e08842b21b4fca8b98165d2a
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Reviewed-on: https://review.whamcloud.com/34767
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
misc/mke2fs.c

index 67176c0..2ccd7a6 100644 (file)
@@ -1417,6 +1417,9 @@ int get_bool_from_profile(char **types, const char *opt, int def_val)
 extern const char *mke2fs_default_profile;
 static const char *default_files[] = { "<default>", 0 };
 
+#define        OPTIMIZED_STRIPE_WIDTH  512
+#define        OPTIMIZED_STRIDE        512
+
 #ifdef HAVE_BLKID_PROBE_GET_TOPOLOGY
 /*
  * Sets the geometry of a device (stripe/stride), and returns the
@@ -1447,7 +1450,19 @@ static int get_device_geometry(const char *file,
                goto out;
 
        min_io = blkid_topology_get_minimum_io_size(tp);
+       if (min_io > OPTIMIZED_STRIDE) {
+               fprintf(stdout,
+                       "detected raid stride %lu too large, use optimum %lu\n",
+                       min_io, OPTIMIZED_STRIDE);
+               min_io = OPTIMIZED_STRIDE;
+       }
        opt_io = blkid_topology_get_optimal_io_size(tp);
+       if (opt_io > OPTIMIZED_STRIPE_WIDTH) {
+               fprintf(stdout,
+                       "detected raid stripe width %lu too large, use optimum %lu\n",
+                       opt_io, OPTIMIZED_STRIPE_WIDTH);
+               opt_io = OPTIMIZED_STRIPE_WIDTH;
+       }
        blocksize = EXT2_BLOCK_SIZE(param);
        if ((min_io == 0) && (psector_size > blocksize))
                min_io = psector_size;