mm: don't reclaim inodes with many attached pages
authorRoman Gushchin <[email protected]>
Fri, 16 Nov 2018 23:08:18 +0000 (15:08 -0800)
committerLinus Torvalds <[email protected]>
Sun, 18 Nov 2018 18:15:09 +0000 (10:15 -0800)
commita76cf1a474d7dbcd9336b5f5afb0162baa142cf0
tree2e7d5550bb70540ebd340f6c0f85f8c989faa3d0
parent9d7899999c62c1a81129b76d2a6ecbc4655e1597
mm: don't reclaim inodes with many attached pages

Spock reported that commit 172b06c32b94 ("mm: slowly shrink slabs with a
relatively small number of objects") leads to a regression on his setup:
periodically the majority of the pagecache is evicted without an obvious
reason, while before the change the amount of free memory was balancing
around the watermark.

The reason behind is that the mentioned above change created some
minimal background pressure on the inode cache.  The problem is that if
an inode is considered to be reclaimed, all belonging pagecache page are
stripped, no matter how many of them are there.  So, if a huge
multi-gigabyte file is cached in the memory, and the goal is to reclaim
only few slab objects (unused inodes), we still can eventually evict all
gigabytes of the pagecache at once.

The workload described by Spock has few large non-mapped files in the
pagecache, so it's especially noticeable.

To solve the problem let's postpone the reclaim of inodes, which have
more than 1 attached page.  Let's wait until the pagecache pages will be
evicted naturally by scanning the corresponding LRU lists, and only then
reclaim the inode structure.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Roman Gushchin <[email protected]>
Reported-by: Spock <[email protected]>
Tested-by: Spock <[email protected]>
Reviewed-by: Andrew Morton <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Randy Dunlap <[email protected]>
Cc: <[email protected]> [4.19.x]
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
fs/inode.c