• Christoph Hellwig's avatar
    btrfs: increase direct io read size limit to 256 sectors · ee5b46a3
    Christoph Hellwig authored
    Btrfs currently limits direct I/O reads to a single sector, which goes
    back to commit c329861d ("Btrfs: don't allocate a separate csums
    array for direct reads") from Josef.  That commit changes the direct I/O
    code to ".. use the private part of the io_tree for our csums.", but ten
    years later that isn't how checksums for direct reads work, instead they
    use a csums allocation on a per-btrfs_dio_private basis (which have their
    own performance problem for small I/O, but that will be addressed later).
    
    There is no fundamental limit in btrfs itself to limit the I/O size
    except for the size of the checksum array that scales linearly with
    the number of sectors in an I/O.  Pick a somewhat arbitrary limit of
    256 limits, which matches what the buffered reads typically see as
    the upper limit as the limit for direct I/O as well.
    
    This significantly improves direct read performance.  For example a fio
    run doing 1 MiB aio reads with a queue depth of 1 roughly triples the
    throughput:
    
    Baseline:
    
    READ: bw=65.3MiB/s (68.5MB/s), 65.3MiB/s-65.3MiB/s (68.5MB/s-68.5MB/s), io=19.1GiB (20.6GB), run=300013-300013msec
    
    With this patch:
    
    READ: bw=196MiB/s (206MB/s), 196MiB/s-196MiB/s (206MB/s-206MB/s), io=57.5GiB (61.7GB), run=300006-300006msc
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ee5b46a3
volumes.h 20.7 KB