• Coly Li's avatar
    bcache: performance improvement for btree_flush_write() · 91be66e1
    Coly Li authored
    This patch improves performance for btree_flush_write() in following
    ways,
    - Use another spinlock journal.flush_write_lock to replace the very
      hot journal.lock. We don't have to use journal.lock here, selecting
      candidate btree nodes takes a lot of time, hold journal.lock here will
      block other jouranling threads and drop the overall I/O performance.
    - Only select flushing btree node from c->btree_cache list. When the
      machine has a large system memory, mca cache may have a huge number of
      cached btree nodes. Iterating all the cached nodes will take a lot
      of CPU time, and most of the nodes on c->btree_cache_freeable and
      c->btree_cache_freed lists are cleared and have need to flush. So only
      travel mca list c->btree_cache to select flushing btree node should be
      enough for most of the cases.
    - Don't iterate whole c->btree_cache list, only reversely select first
      BTREE_FLUSH_NR btree nodes to flush. Iterate all btree nodes from
      c->btree_cache and select the oldest journal pin btree nodes consumes
      huge number of CPU cycles if the list is huge (push and pop a node
      into/out of a heap is expensive). The last several dirty btree nodes
      on the tail of c->btree_cache list are earlest allocated and cached
      btree nodes, they are relative to the oldest journal pin btree nodes.
      Therefore only flushing BTREE_FLUSH_NR btree nodes from tail of
      c->btree_cache probably includes the oldest journal pin btree nodes.
    
    In my testing, the above change decreases 50%+ CPU consumption when
    journal space is full. Some times IOPS drops to 0 for 5-8 seconds,
    comparing blocking I/O for 120+ seconds in previous code, this is much
    better. Maybe there is room to improve in future, but at this momment
    the fix looks fine and performs well in my testing.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    91be66e1
journal.h 6.41 KB