• Filipe David Borba Manana's avatar
    Btrfs: try harder to avoid btree node splits · 5a4267ca
    Filipe David Borba Manana authored
    When attempting to move items from our target leaf to its neighbor
    leaves (right and left), we only need to free data_size - free_space
    bytes from our leaf in order to add the new item (which has size of
    data_size bytes). Therefore attempt to move items to the right and
    left leaves if they have at least data_size - free_space bytes free,
    instead of data_size bytes free.
    
    After 5 runs of the following test, I got a smaller number of btree
    node splits overall:
    
    sysbench --test=fileio --file-num=512 --file-total-size=5G \
      --file-test-mode=seqwr --num-threads=512 \
       --file-block-size=8192 --max-requests=100000 --file-io-mode=sync
    
    Before this change:
    * 6171 splits (average of 5 test runs)
    * 61.508Mb/sec of throughput (average of 5 test runs)
    
    After this change:
    * 6036 splits (average of 5 test runs)
    * 63.533Mb/sec of throughput (average of 5 test runs)
    
    An ideal test would not just have multiple threads/processes writing
    to a file (insertion of file extent items) but also do other operations
    that result in insertion of items with varied sizes, like file/directory
    creations, creation of links, symlinks, xattrs, etc.
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    5a4267ca
ctree.c 148 KB