Skip to content
  • Liu Bo's avatar
    Btrfs: improve multi-thread buffer read · 67c9684f
    Liu Bo authored
    
    
    While testing with my buffer read fio jobs[1], I find that btrfs does not
    perform well enough.
    
    Here is a scenario in fio jobs:
    
    We have 4 threads, "t1 t2 t3 t4", starting to buffer read a same file,
    and all of them will race on add_to_page_cache_lru(), and if one thread
    successfully puts its page into the page cache, it takes the responsibility
    to read the page's data.
    
    And what's more, reading a page needs a period of time to finish, in which
    other threads can slide in and process rest pages:
    
         t1          t2          t3          t4
       add Page1
       read Page1  add Page2
         |         read Page2  add Page3
         |            |        read Page3  add Page4
         |            |           |        read Page4
    -----|------------|-----------|-----------|--------
         v            v           v           v
        bio          bio         bio         bio
    
    Now we have four bios, each of which holds only one page since we need to
    maintain consecutive pages in bio.  Thus, we can end up with far more bios
    than we need.
    
    Here we're going to
    a) delay the real read-page section and
    b) try to put more pages into page cache.
    
    With that said, we can make each bio hold more pages and reduce the number
    of bios we need.
    
    Here is some numbers taken from fio results:
             w/o patch                 w patch
           -------------  --------  ---------------
    READ:    745MB/s        +25%       934MB/s
    
    [1]:
    [global]
    group_reporting
    thread
    numjobs=4
    bs=32k
    rw=read
    ioengine=sync
    directory=/mnt/btrfs/
    
    [READ]
    filename=foobar
    size=2000M
    invalidate=1
    
    Signed-off-by: default avatarLiu Bo <liubo2009@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    67c9684f