btrfs-progs: fi defrag: change default extent target size to 32 MiB
authorDavid Sterba <dsterba@suse.com>
Thu, 28 Jul 2016 11:14:08 +0000 (13:14 +0200)
committerDavid Sterba <dsterba@suse.com>
Thu, 28 Jul 2016 12:08:30 +0000 (14:08 +0200)
The kernel default is too low, 32 MiB is recommended and should give
better results.

Signed-off-by: David Sterba <dsterba@suse.com>
Documentation/btrfs-filesystem.asciidoc
cmds-filesystem.c

index 8fb15ea..9782af9 100644 (file)
@@ -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 <start>[kKmMgGtTpPeE]::::
 defragmentation will start from the given offset, default is beginning of a file
 -l <len>[kKmMgGtTpPeE]::::
 defragment only up to 'len' bytes, default is the file size
 -t <size>[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] <path> [<path>..]::
 Calculate disk usage of the target files using FIEMAP. For individual
index ef1f550..00e4bfe 100644 (file)
@@ -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;