Skip to content
  • Sagar Vemuri's avatar
    Improve explicit user readahead performance (#5246) · 3548e422
    Sagar Vemuri authored
    Summary:
    Improve the iterators performance when the user explicitly sets the readahead size via `ReadOptions.readahead_size`.
    
    1. Stop creating new table readers when the user explicitly sets readahead size.
    2. Make use of an internal buffer based on `FilePrefetchBuffer` instead of using `ReadaheadRandomAccessFileReader`, to handle the user readahead requests (for both buffered and direct io cases).
    3. Add `readahead_size` to db_bench.
    
    **Benchmarks:**
    https://gist.github.com/sagar0/53693edc320a18abeaeca94ca32f5737
    
    For 1 MB readahead, Buffered IO performance improves by 28% and Direct IO performance improves by 50%.
    For 512KB readahead, Buffered IO performance improves by 30% and Direct IO performance improves by 67%.
    
    **Test Plan:**
    Updated `DBIteratorTest.ReadAhead` test to make sure that:
    - no new table readers are created for iterators on setting ReadOptions.readahead_size
    - At least "readahead" number of bytes are actually getting read on each iterator read.
    
    TODO later:
    - Use similar logic for compactions as well.
    - This ties in nicely with #4052 and paves the way for removing ReadaheadRandomAcessFile later.
    Pull Request resolved: https://github.com/facebook/rocksdb/pull/5246
    
    Differential Revision: D15107946
    
    Pulled By: sagar0
    
    fbshipit-source-id: 2c1149729ca7d779e4e8b7710ba6f4e8cbfd3bea
    3548e422