[Devel] [PATCH rh7 1/4] mm: vmscan: don't drop global slab caches at once if root cgroup is empty

Vladimir Davydov vdavydov at virtuozzo.com
Fri Feb 12 06:48:16 PST 2016


If most processes reside in memory cgroups protected with memory.low,
there won't be a lot of pages in the root cgroup's lruvec so that the
lru scanned/eligible ratio can get high even on the initial scan
priority. In this case global slab caches will be evicted far too
aggressively. Tcache/tswap are especially affected - if the node is
undercommitted, they may occupy gigabytes of RAM which can be dropped in
an instant even on very low memory pressure.

To fix this, we forge scanned/eligible ratio passed to slab shrinkers if
the number of pages on the root lruvec is small.

Signed-off-by: Vladimir Davydov <vdavydov at virtuozzo.com>
---
 mm/vmscan.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index 0406c11287f5..a7cc964f0835 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2388,10 +2388,29 @@ static void shrink_zone(struct zone *zone, struct scan_control *sc,
 		 * Shrink the slab caches in the same proportion that
 		 * the eligible LRU pages were scanned.
 		 */
-		if (global_reclaim(sc) && is_classzone)
+		if (global_reclaim(sc) && is_classzone) {
+			unsigned long scanned, eligible;
+
+			scanned = sc->nr_scanned - nr_scanned;
+			eligible = zone_lru_pages;
+
+			/*
+			 * If most processes reside in memory cgroups protected
+			 * with memory.low there won't be a lot of user pages
+			 * in the root lruvec so that the lru scanned/eligible
+			 * ratio ratio can get high even on the default scan
+			 * priority. In order not to subject memcg unaware slab
+			 * caches to disproportionately high pressure, we forge
+			 * the ratio in this case.
+			 */
+			if (eligible >> sc->priority == 0) {
+				scanned = 1000;
+				eligible = 1000 << sc->priority;
+			}
+
 			shrink_slab(slab_gfp, zone_to_nid(zone), NULL,
-				    sc->nr_scanned - nr_scanned,
-				    zone_lru_pages);
+				    scanned, eligible);
+		}
 
 		if (reclaim_state) {
 			sc->nr_reclaimed += reclaim_state->reclaimed_slab;
-- 
2.1.4



More information about the Devel mailing list