• Chao Yu's avatar
    f2fs: refactor flush_nat_entries codes for reducing NAT writes · aec71382
    Chao Yu authored
    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.
    
    In this patch we merge dirty entries located in same NAT block to nat entry set,
    and linked all set to list, sorted ascending order by entries' count of set.
    Later we flush entries in sparse set into journal as many as we can, and then
    flush merged entries to disk. In this way we can not only gain in performance,
    but also save lifetime of flash device.
    
    In my testing environment, it shows this patch can help to reduce NAT block
    writes obviously. In hard disk test case: cost time of fsstress is stablely
    reduced by about 5%.
    
    1. virtual machine + hard disk:
    fsstress -p 20 -n 200 -l 5
    		node num	cp count	nodes/cp
    based		4599.6		1803.0		2.551
    patched		2714.6		1829.6		1.483
    
    2. virtual machine + 32g micro SD card:
    fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0
    -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5
    -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S
    
    		node num	cp count	nodes/cp
    based		84.5		43.7		1.933
    patched		49.2		40.0		1.23
    
    Our latency of merging op shows not bad when handling extreme case like:
    merging a great number of dirty nats:
    latency(ns)	dirty nat count
    3089219		24922
    5129423		27422
    4000250		24523
    
    change log from v1:
     o fix wrong logic in add_nat_entry when grab a new nat entry set.
     o swith to create slab cache in create_node_manager_caches.
     o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency.
    
    change log from v2:
     o make comment position more appropriate suggested by Jaegeuk Kim.
    Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    aec71382
f2fs.h 42.6 KB