Hi Pengyang,

Could you please shed a light on some performance gains by this?

Thanks,

On 05/20, Hou Pengyang wrote:
> This patches are to designed to optimize NAT/SIT flushing procedure:
> 
> patch 1) -- patch 3):
> 
> during flush_nat_entries, we do: 
> 1) gang_lookup a radix tree, find all the dirty nat_entry_set;
> 2) sort nat_entry_set by nat_entry_set->entry_cnt, in order to 
>     write to journal as much as possible to avoid unnessary IO. 
> 
> This patch optimize the look_up & sort algorithm by introducing an array:
> 
>     f2fs_nm_info->dirty_set[NAT_ENTRY_PER_BLOCK+1];
>     (struct list_head dirty_set[NAT_ENTRY_PER_BLOCK + 1]) 
> 
> dirty_set[1] links all nat_entry_set whose entry_cnt is 1
> dirty_set[2] links all nat_entry_set whose entry_cnt is 2
> ......
> dirty_set[N] links all nat_entry_set whose entry_cnt is N
> 
> as one NAT block has NAT_ENTRY_PER_BLOCK entries at MOST, so there should NOT 
> be one nat_entry_set whose entry_cnt is larger than NAT_ENTRY_PER_BLOCK.
> 
> So it is enough for f2fs_nm_info->dirty_set to link all nat_entry_sets in 
> system.
> 
> Update:
>     we update nat_entry_set in real-time, e.g originally 
> nat_entry_set->entry_cnt is
> 1, and licked by dirty_set[1]; then call __set_nat_cache_dirty to increase 
> nat_entry's
> entry_cnt, we move this nat_entry_set ot dirty_set[2]'s tail, no need to 
> compare.
> 
> Flush:
>     when flush dirty nat_entry_set, we just flush nat_entry_set from 
> f2fs_nm_info->dirty_set[0] to f2fs_nm_info->dirty_set[NAT_ENTRY_PER_BLOCK], 
> where
> gang_lookup and sort can be avoid.
>     
> footprint of this algorithm:  sizeof(struct list_head)*NAT_ENTRY_PER_BLOCK
>                               = 8*455 = 3.6k bytes
> 
> Same for SIT.
> 
> In patch 5), we use array to manage sit_entry_sets instead of list, which 
> can avoid list travel, and there is no need to alloc/free lab memory.
> It is low footrpint consuming.
> 
> Hou Pengyang (5):
>   f2fs: use bucket sort to avoid tree lookup and list sort when nat flushing
>   f2fs: reconstruct sit flushing code
>   f2fs: use bucket sort to avoid list sort when flush sit entries
>   f2fs: avoid unnecessary to_journal checking
>   f2fs: use an array to record sit_entry_set info to make sort fast
> 
>  fs/f2fs/f2fs.h    |   5 +-
>  fs/f2fs/node.c    |  79 ++++++++-----------
>  fs/f2fs/segment.c | 227 
> ++++++++++++++++++++++++++----------------------------
>  fs/f2fs/segment.h |   2 +-
>  4 files changed, 147 insertions(+), 166 deletions(-)
> 
> -- 
> 2.10.1
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to