• C
    f2fs: refactor flush_sit_entries codes for reducing SIT writes · 184a5cd2
    Chao Yu 提交于
    In commit aec71382 ("f2fs: refactor flush_nat_entries codes for reducing NAT
    writes"), we descripte the issue as below:
    
    "Although building NAT journal in cursum reduce the read/write work for NAT
    block, but previous design leave us lower performance when write checkpoint
    frequently for these cases:
    1. if journal in cursum has already full, it's a bit of waste that we flush all
       nat entries to page for persistence, but not to cache any entries.
    2. if journal in cursum is not full, we fill nat entries to journal util
       journal is full, then flush the left dirty entries to disk without merge
       journaled entries, so these journaled entries may be flushed to disk at next
       checkpoint but lost chance to flushed last time."
    
    Actually, we have the same problem in using SIT journal area.
    
    In this patch, firstly we will update sit journal with dirty entries as many as
    possible. Secondly if there is no space in sit journal, we will remove all
    entries in journal and walk through the whole dirty entry bitmap of sit,
    accounting dirty sit entries located in same SIT block to sit entry set. All
    entry sets are linked to list sit_entry_set in sm_info, sorted ascending order
    by count of entries in set. Later we flush entries in set which have fewest
    entries into journal as many as we can, and then flush dense set with merged
    entries to disk.
    
    In this way we can use sit journal area more effectively, also we will reduce
    SIT update, result in gaining in performance and saving lifetime of flash
    device.
    
    In my testing environment, it shows this patch can help to reduce SIT block
    update obviously.
    
    virtual machine + hard disk:
    fsstress -p 20 -n 400 -l 5
    		sit page num	cp count	sit pages/cp
    based		2006.50		1349.75		1.486
    patched		1566.25		1463.25		1.070
    
    Our latency of merging op is small when handling a great number of dirty SIT
    entries in flush_sit_entries:
    latency(ns)	dirty sit count
    36038		2151
    49168		2123
    37174		2232
    Signed-off-by: NChao Yu <chao2.yu@samsung.com>
    Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
    184a5cd2
segment.h 22.1 KB