• Filipe Manana's avatar
    Btrfs: more efficient btrfs_drop_extent_cache · 176840b3
    Filipe Manana authored
    While droping extent map structures from the extent cache that cover our
    target range, we would remove each extent map structure from the red black
    tree and then add either 1 or 2 new extent map structures if the former
    extent map covered sections outside our target range.
    
    This change simply attempts to replace the existing extent map structure
    with a new one that covers the subsection we're not interested in, instead
    of doing a red black remove operation followed by an insertion operation.
    
    The number of elements in an inode's extent map tree can get very high for large
    files under random writes. For example, while running the following test:
    
        sysbench --test=fileio --file-num=1 --file-total-size=10G \
            --file-test-mode=rndrw --num-threads=32 --file-block-size=32768 \
            --max-requests=500000 --file-rw-ratio=2 [prepare|run]
    
    I captured the following histogram capturing the number of extent_map items
    in the red black tree while that test was running:
    
        Count: 122462
        Range:  1.000 - 172231.000; Mean: 96415.831; Median: 101855.000; Stddev: 49700.981
        Percentiles:  90th: 160120.000; 95th: 166335.000; 99th: 171070.000
           1.000 -    5.231:   452 |
           5.231 -  187.392:    87 |
         187.392 -  585.911:   206 |
         585.911 - 1827.438:   623 |
        1827.438 - 5695.245:  1962 #
        5695.245 - 17744.861:  6204 ####
       17744.861 - 55283.764: 21115 ############
       55283.764 - 172231.000: 91813 #####################################################
    
    Benchmark:
    
        sysbench --test=fileio --file-num=1 --file-total-size=10G --file-test-mode=rndwr \
            --num-threads=64 --file-block-size=32768 --max-requests=0 --max-time=60 \
            --file-io-mode=sync --file-fsync-freq=0 [prepare|run]
    
    Before this change: 122.1Mb/sec
    After this change:  125.07Mb/sec
    (averages of 5 test runs)
    
    Test machine: quad core intel i5-3570K, 32Gb of ram, SSD
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    176840b3
extent_map.h 2.34 KB