linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Partially revert "mm/memcontrol.c: keep local VM counters in sync with the hierarchical ones"
@ 2019-08-17  0:47 Roman Gushchin
  2019-08-17  3:33 ` Yafang Shao
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Roman Gushchin @ 2019-08-17  0:47 UTC (permalink / raw)
  To: Andrew Morton, linux-mm
  Cc: Michal Hocko, Johannes Weiner, linux-kernel, kernel-team, stable,
	Roman Gushchin, Yafang Shao

Commit 766a4c19d880 ("mm/memcontrol.c: keep local VM counters in sync
with the hierarchical ones") effectively decreased the precision of
per-memcg vmstats_local and per-memcg-per-node lruvec percpu counters.

That's good for displaying in memory.stat, but brings a serious regression
into the reclaim process.

One issue I've discovered and debugged is the following:
lruvec_lru_size() can return 0 instead of the actual number of pages
in the lru list, preventing the kernel to reclaim last remaining
pages. Result is yet another dying memory cgroups flooding.
The opposite is also happening: scanning an empty lru list
is the waste of cpu time.

Also, inactive_list_is_low() can return incorrect values, preventing
the active lru from being scanned and freed. It can fail both because
the size of active and inactive lists are inaccurate, and because
the number of workingset refaults isn't precise. In other words,
the result is pretty random.

I'm not sure, if using the approximate number of slab pages in
count_shadow_number() is acceptable, but issues described above
are enough to partially revert the patch.

Let's keep per-memcg vmstat_local batched (they are only used for
displaying stats to the userspace), but keep lruvec stats precise.
This change fixes the dead memcg flooding on my setup.

Fixes: 766a4c19d880 ("mm/memcontrol.c: keep local VM counters in sync with the hierarchical ones")
Signed-off-by: Roman Gushchin <guro@fb.com>
Cc: Yafang Shao <laoar.shao@gmail.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
---
 mm/memcontrol.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 249187907339..3429340adb56 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -746,15 +746,13 @@ void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx,
 	/* Update memcg */
 	__mod_memcg_state(memcg, idx, val);
 
+	/* Update lruvec */
+	__this_cpu_add(pn->lruvec_stat_local->count[idx], val);
+
 	x = val + __this_cpu_read(pn->lruvec_stat_cpu->count[idx]);
 	if (unlikely(abs(x) > MEMCG_CHARGE_BATCH)) {
 		struct mem_cgroup_per_node *pi;
 
-		/*
-		 * Batch local counters to keep them in sync with
-		 * the hierarchical ones.
-		 */
-		__this_cpu_add(pn->lruvec_stat_local->count[idx], x);
 		for (pi = pn; pi; pi = parent_nodeinfo(pi, pgdat->node_id))
 			atomic_long_add(x, &pi->lruvec_stat[idx]);
 		x = 0;
-- 
2.21.0



^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-08-27 18:39 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-17  0:47 [PATCH] Partially revert "mm/memcontrol.c: keep local VM counters in sync with the hierarchical ones" Roman Gushchin
2019-08-17  3:33 ` Yafang Shao
2019-08-17 19:14   ` Roman Gushchin
2019-08-18  0:30     ` Yafang Shao
2019-08-19 21:20       ` Roman Gushchin
2019-08-20  1:29         ` Yafang Shao
2019-08-17  6:36 ` Greg KH
2019-08-17 19:15   ` Roman Gushchin
2019-08-24 19:57     ` Andrew Morton
2019-08-24 20:23       ` Thomas Backlund
2019-08-27 14:10         ` Michal Hocko
2019-08-27 17:06           ` Greg KH
2019-08-27 17:39             ` Michal Hocko
2019-08-27 18:39               ` Greg KH
2019-08-23 22:33 ` Roman Gushchin
2019-08-24  3:41   ` Yafang Shao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox