[RHEL7,COMMIT] ms/mm: workingset: size shadow nodes lru basing on file cache size

Submitted by Konstantin Khorenko on Jan. 10, 2019, 2:08 p.m.


Message ID 201901101408.x0AE8Y55004443@finist-ce7.sw.ru
State New
Series "Series without cover letter"
Headers show

Commit Message

Konstantin Khorenko Jan. 10, 2019, 2:08 p.m.
The commit is pushed to "branch-rh7-3.10.0-957.1.3.vz7.83.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-957.1.3.vz7.83.4
commit 151cd9c1f32eb1cc7f997faa1fa646161e296efe
Author: Vladimir Davydov <vdavydov@virtuozzo.com>
Date:   Thu Jan 10 17:08:34 2019 +0300

    ms/mm: workingset: size shadow nodes lru basing on file cache size
    A page is activated on refault if the refault distance stored in the
    corresponding shadow entry is less than the number of active file pages.
    Since active file pages can't occupy more than half memory, we assume
    that the maximal effective refault distance can't be greater than half
    the number of present pages and size the shadow nodes lru list
    appropriately.  Generally speaking, this assumption is correct, but it
    can result in wasting a considerable chunk of memory on stale shadow
    nodes in case the portion of file pages is small, e.g.  if a workload
    mostly uses anonymous memory.
    To sort this out, we need to compute the size of shadow nodes lru basing
    not on the maximal possible, but the current size of file cache.  We
    could take the size of active file lru for the maximal refault distance,
    but active lru is pretty unstable - it can shrink dramatically at
    runtime possibly disrupting workingset detection logic.
    Instead we assume that the maximal refault distance equals half the
    total number of file cache pages.  This will protect us against active
    file lru size fluctuations while still being correct, because size of
    active lru is normally maintained lower than size of inactive lru.
    Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>
    Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    (cherry picked from commit cdcbb72ebfec52373e57092eccaadd5a6e261c3e)
    Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
 mm/workingset.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/mm/workingset.c b/mm/workingset.c
index 559bd786d538..02291d3243d3 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -278,7 +278,9 @@  static unsigned long count_shadow_nodes(struct shrinker *shrinker,
 	shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc);
-	pages = node_present_pages(sc->nid);
+	pages = node_page_state(sc->nid, NR_ACTIVE_FILE) +
+		node_page_state(sc->nid, NR_INACTIVE_FILE);
 	 * Active cache pages are limited to 50% of memory, and shadow
 	 * entries that represent a refault distance bigger than that