• Josef Bacik's avatar
    Btrfs: don't do nocow check unless we have to · c6887cd1
    Josef Bacik authored
    Before we write into prealloc/nocow space we have to make sure that there are no
    references to the extents we are writing into, which means checking the extent
    tree and csum tree in the case of nocow.  So we don't want to do the nocow dance
    unless we can't reserve data space, since it's a serious drag on performance.
    With the following sequence
    
    fallocate -l10737418240 /mnt/btrfs-test/file
    cp --reflink /mnt/btrfs-test/file /mnt/btrfs-test/link
    fio --name=randwrite --rw=randwrite --bs=4k --filename=/mnt/btrfs-test/file \
    	--end_fsync=1
    
    we get the worst case scenario where we have to fall back on to doing the check
    anyway.
    
    Without this patch
    lat (usec): min=5, max=111598, avg=27.65, stdev=124.51
    write: io=10240MB, bw=126876KB/s, iops=31718, runt= 82646msec
    
    With this patch
    lat (usec): min=3, max=91210, avg=14.09, stdev=110.62
    write: io=10240MB, bw=212753KB/s, iops=53188, runt= 49286msec
    
    We get twice the throughput, half of the runtime, and half of the average
    latency.  Thanks,
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    [ PAGE_CACHE_ removal related fixups ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    c6887cd1
file.c 80.4 KB