summaryrefslogtreecommitdiff
path: root/resize
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2014-07-25 13:38:50 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-07-26 00:48:29 -0400
commitbaab9f43bf0ecacd043dafb2de29163da5deaf24 (patch)
tree84b3fda0ca5fcde7253da2d9afaacdaacaac5e9e /resize
parent2dbf34e50562d08d5da4d3f373f3bc0b2fd46728 (diff)
downloade2fsprogs-baab9f43bf0ecacd043dafb2de29163da5deaf24.tar.gz
resize2fs: radically reduce memory utilization by using rbtree bitmaps
When resizing an empty 21T file system to 28T, resize2fs was using this much CPU time and memory: 216.98user 19.77system 4:02.92elapsed 97%CPU (0avgtext+0avgdata 4485664maxresident)k 8inputs+1068680outputs (0major+800745minor)pagefaults 0swaps After this one-line change: 222.29user 0.49system 3:48.79elapsed 97%CPU (0avgtext+0avgdata 30080maxresident)k 8inputs+1068552outputs (0major+2497minor)pagefaults 0swaps So this reduces the max memory utilized from 4.2GB to 29MB! For future work, the primary place where we are spending the most cpu time (from resize2fs -d 16) are these two places: blocks_to_move: Memory used: 2508k/25096k (1903k/606k), time: 91.42/91.53/ 0.00 and calculate_summary_stats: Memory used: 2508k/25612k (1908k/601k), time: 95.33/95.45/ 0.00 The calculate_summary_stats pass can be sped up by using ext2fs_find_first_{zero,set}_block_bitmap2(), instead of iterating over the entire block bitmap one bit at a time. The blocks_to_move pass can be sped up by using a bitmap to store the location of fs metadata blocks, to avoid an O(N**2) algorithm where N is the number of groups in the file system. Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'resize')
-rw-r--r--resize/main.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/resize/main.c b/resize/main.c
index e4b44354..ef2a810b 100644
--- a/resize/main.c
+++ b/resize/main.c
@@ -318,6 +318,7 @@ int main (int argc, char ** argv)
printf("%s", _("Couldn't find valid filesystem superblock.\n"));
exit (1);
}
+ fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE;
if (!(mount_flags & EXT2_MF_MOUNTED)) {
if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) ||