linux/fs/ext4
Zheng Liu d3922a777f ext4: improve extent cache shrink mechanism to avoid to burn CPU time
Now we maintain an proper in-order LRU list in ext4 to reclaim entries
from extent status tree when we are under heavy memory pressure.  For
keeping this order, a spin lock is used to protect this list.  But this
lock burns a lot of CPU time.  We can use the following steps to trigger
it.

  % cd /dev/shm
  % dd if=/dev/zero of=ext4-img bs=1M count=2k
  % mkfs.ext4 ext4-img
  % mount -t ext4 -o loop ext4-img /mnt
  % cd /mnt
  % for ((i=0;i<160;i++)); do truncate -s 64g $i; done
  % for ((i=0;i<160;i++)); do cp $i /dev/null &; done
  % perf record -a -g
  % perf report

This commit tries to fix this problem.  Now a new member called
i_touch_when is added into ext4_inode_info to record the last access
time for an inode.  Meanwhile we never need to keep a proper in-order
LRU list.  So this can avoid to burns some CPU time.  When we try to
reclaim some entries from extent status tree, we use list_sort() to get
a proper in-order list.  Then we traverse this list to discard some
entries.  In ext4_sb_info, we use s_es_last_sorted to record the last
time of sorting this list.  When we traverse the list, we skip the inode
that is newer than this time, and move this inode to the tail of LRU
list.  When the head of the list is newer than s_es_last_sorted, we will
sort the LRU list again.

In this commit, we break the loop if s_extent_cache_cnt == 0 because
that means that all extents in extent status tree have been reclaimed.

Meanwhile in this commit, ext4_es_{un}register_shrinker()'s prototype is
changed to save a local variable in these functions.

Reported-by: Dave Hansen <dave.hansen@intel.com>
Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2013-07-01 08:12:37 -04:00
..
acl.c ext4: fix the number of credits needed for acl ops with inline data 2013-02-09 15:23:03 -05:00
acl.h fs: take the ACL checks to common code 2011-07-25 14:30:23 -04:00
balloc.c ext4: optimize test_root() 2013-06-06 11:40:37 -04:00
bitmap.c ext4: Checksum the block bitmap properly with bigalloc enabled 2012-10-22 00:34:32 -04:00
block_validity.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
dir.c ext4: fix readdir error in the case of inline_data+dir_index 2013-04-19 17:53:09 -04:00
ext4_extents.h ext4: mext_insert_extents should update extent block checksum 2013-04-19 14:04:12 -04:00
ext4_jbd2.c ext4: provide wrappers for transaction reservation calls 2013-06-04 12:37:50 -04:00
ext4_jbd2.h ext4: use transaction reservation for extent conversion in ext4_end_io 2013-06-04 13:21:11 -04:00
ext4.h ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
extents_status.c ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
extents_status.h ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
extents.c ext4: return FIEMAP_EXTENT_UNKNOWN for delalloc extents 2013-06-12 23:13:59 -04:00
file.c ext4: fix overflows in SEEK_HOLE, SEEK_DATA implementations 2013-05-31 19:37:56 -04:00
fsync.c ext4: Fix fsync error handling after filesystem abort 2013-06-12 22:38:04 -04:00
hash.c ext4: reduce one "if" comparison in ext4_dirhash() 2013-02-01 22:33:21 -05:00
ialloc.c ext4: provide wrappers for transaction reservation calls 2013-06-04 12:37:50 -04:00
indirect.c ext4: don't use EXT4_FREE_BLOCKS_FORGET unnecessarily 2013-06-12 11:48:29 -04:00
inline.c ext4: fix data offset overflow on 32-bit archs in ext4_inline_data_fiemap() 2013-05-31 19:33:42 -04:00
inode.c ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
ioctl.c ext4: fix usless declarations 2013-04-09 22:48:36 -04:00
Kconfig ext4: fix Kconfig documentation for CONFIG_EXT4_DEBUG 2013-04-21 20:32:03 -04:00
Makefile ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
mballoc.c ext4: implement error handling of ext4_mb_new_preallocation() 2013-07-01 08:12:36 -04:00
mballoc.h ext4: use module parameters instead of debugfs for mballoc_debug 2013-02-09 16:28:20 -05:00
migrate.c ext4: do not convert to indirect with bigalloc enabled 2013-04-11 10:54:46 -04:00
mmp.c ext4: mark all metadata I/O with REQ_META 2013-04-20 15:46:17 -04:00
move_extent.c ext4: delete unused variables 2013-06-17 08:56:26 -04:00
namei.c ext4: fix readdir error in the case of inline_data+dir_index 2013-04-19 17:53:09 -04:00
page-io.c ext4: add check to io_submit_init_bio 2013-06-06 10:18:22 -04:00
resize.c ext4: fix corruption when online resizing a fs with 1K block size 2013-07-01 08:12:08 -04:00
super.c ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
symlink.c ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr_security.c Merge branch 'for_linus' into for_linus_merged 2012-01-10 11:54:07 -05:00
xattr_trusted.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr_user.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr.c ext4: fix miscellaneous big endian warnings 2013-04-09 23:59:55 -04:00
xattr.h ext4: reserve xattr index for Rich ACL support 2013-04-18 14:53:15 -04:00