From 2f732723d6c1e3b6e9205e96da4c600ee72de875 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Thu, 28 Jul 2016 13:14:08 +0200 Subject: [PATCH] btrfs-progs: fi defrag: change default extent target size to 32 MiB The kernel default is too low, 32 MiB is recommended and should give better results. Signed-off-by: David Sterba --- Documentation/btrfs-filesystem.asciidoc | 16 ++++++++++++---- cmds-filesystem.c | 11 +++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Documentation/btrfs-filesystem.asciidoc b/Documentation/btrfs-filesystem.asciidoc index 8fb15ea..9782af9 100644 --- a/Documentation/btrfs-filesystem.asciidoc +++ b/Documentation/btrfs-filesystem.asciidoc @@ -117,15 +117,23 @@ compression. See also section 'EXAMPLES'. -r:::: defragment files recursively in given directories -f:::: -flush data for each file before going to the next file. This will limit the amount -of dirty data to current file, otherwise the amount cumulates from several files -and may increase system load. +flush data for each file before going to the next file. ++ +This will limit the amount of dirty data to current file, otherwise the amount +cumulates from several files and will increase system load. This can also lead +to ENOSPC if there's too much dirty data to write and it's not possible to make +the reservations for the new data (ie. how the COW design works). ++ -s [kKmMgGtTpPeE]:::: defragmentation will start from the given offset, default is beginning of a file -l [kKmMgGtTpPeE]:::: defragment only up to 'len' bytes, default is the file size -t [kKmMgGtTpPeE]:::: -target extent size, do not touch extents bigger than 'size' +target extent size, do not touch extents bigger than 'size', default: 32M ++ +The value is only advisory and the final size of the extents may differ, +depending on the state of the free space and fragmentation or other internal +logic. Reasonable values are from tens to hundreds of megabytes. *du* [options] [..]:: Calculate disk usage of the target files using FIEMAP. For individual diff --git a/cmds-filesystem.c b/cmds-filesystem.c index ef1f550..00e4bfe 100644 --- a/cmds-filesystem.c +++ b/cmds-filesystem.c @@ -968,7 +968,7 @@ static const char * const cmd_filesystem_defrag_usage[] = { "-f flush data to disk immediately after defragmenting", "-s start defragment only from byte onward", "-l len defragment only up to len bytes", - "-t size target extent size hint", + "-t size target extent size hint (default: 32M)", NULL }; @@ -1029,7 +1029,7 @@ static int cmd_filesystem_defrag(int argc, char **argv) int flush = 0; u64 start = 0; u64 len = (u64)-1; - u64 thresh = 0; + u64 thresh; int i; int recursive = 0; int ret = 0; @@ -1037,6 +1037,13 @@ static int cmd_filesystem_defrag(int argc, char **argv) int compress_type = BTRFS_COMPRESS_NONE; DIR *dirstream; + /* + * Kernel has a different default (256K) that is supposed to be safe, + * but it does not defragment very well. The 32M will likely lead to + * better results and is independent of the kernel default. + */ + thresh = 32 * 1024 * 1024; + defrag_global_errors = 0; defrag_global_verbose = 0; defrag_global_errors = 0; -- 2.7.4