Whamcloud - gitweb
resize2fs: avoid constantly flushing while moving blocks
authorAnssi Hannula <anssi.hannula@iki.fi>
Tue, 7 Nov 2023 09:46:53 +0000 (11:46 +0200)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 17 Apr 2024 04:04:24 +0000 (00:04 -0400)
resize2fs block_mover() flushes data after each extent and, curiously,
only if progress indicator is enabled, every inode_blocks_per_group
blocks.

This significantly affects performance, e.g. on a tested large
filesystem on top of MD-RAID6+LVM+dm-crypt these flush calls reduce the
operation rate from approx. 500MB/s to 5MB/s, causing extremely long
shrinking times for large size deltas (70TB in my case).

Since this step performs just plain data copying and does not e.g. save
any progress/checkpoint information or similar metadata, it seems like
this flushing is of very limited usefulness, especially when considering
the (in some cases) 100x performance impact.

Remove the mid-operation flushes and only flush after all blocks have
been moved.

Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Link: https://lore.kernel.org/r/20231107094920.4056281-1-anssi.hannula@iki.fi
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
resize/resize2fs.c

index 5eeb7d4..4654050 100644 (file)
@@ -1863,7 +1863,6 @@ static errcode_t block_mover(ext2_resize_t rfs)
                        old_blk += c;
                        moved += c;
                        if (rfs->progress) {
-                               io_channel_flush(fs->io);
                                retval = (rfs->progress)(rfs,
                                                E2_RSZ_BLOCK_RELOC_PASS,
                                                moved, to_move);
@@ -1871,9 +1870,10 @@ static errcode_t block_mover(ext2_resize_t rfs)
                                        goto errout;
                        }
                } while (size > 0);
-               io_channel_flush(fs->io);
        }
 
+       io_channel_flush(fs->io);
+
 errout:
        if (badblock_list) {
                if (!retval && bb_modified)