From: "Michal Koutný" <mkoutny@suse.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Roman Gushchin <guro@fb.com>, Michal Hocko <mhocko@suse.com>,
Tejun Heo <tj@kernel.org>,
linux-mm@kvack.org, cgroups@vger.kernel.org,
linux-kernel@vger.kernel.org, kernel-team@fb.com
Subject: Re: [PATCH v2 2/3] mm: memcontrol: clean up and document effective low/min calculations
Date: Fri, 21 Feb 2020 18:10:24 +0100 [thread overview]
Message-ID: <20200221171024.GA23476@blackbody.suse.cz> (raw)
In-Reply-To: <20191219200718.15696-3-hannes@cmpxchg.org>
[-- Attachment #1: Type: text/plain, Size: 2489 bytes --]
On Thu, Dec 19, 2019 at 03:07:17PM -0500, Johannes Weiner <hannes@cmpxchg.org> wrote:
> The effective protection of any given cgroup is a somewhat complicated
> construct that depends on the ancestor's configuration, siblings'
> configurations, as well as current memory utilization in all these
> groups.
I agree with that. It makes it a bit hard to determine the equilibrium
in advance.
> + * Consider the following example tree:
> *
> + * A A/memory.low = 2G, A/memory.current = 6G
> + * //\\
> + * BC DE B/memory.low = 3G B/memory.current = 2G
> + * C/memory.low = 1G C/memory.current = 2G
> + * D/memory.low = 0 D/memory.current = 2G
> + * E/memory.low = 10G E/memory.current = 0
> *
> + * and memory pressure is applied, the following memory
> + * distribution is expected (approximately*):
> *
> + * A/memory.current = 2G
> + * B/memory.current = 1.3G
> + * C/memory.current = 0.6G
> + * D/memory.current = 0
> + * E/memory.current = 0
> *
> + * *assuming equal allocation rate and reclaimability
I think the assumptions for this example don't hold (anymore).
Because reclaim rate depends on the usage above protection, the siblings
won't be reclaimed equally and so the low_usage proportionality will
change over time and the equilibrium distribution is IMO different (I'm
attaching an Octave script to calculate it).
As it depends on the initial usage, I don't think there can be given
such a general example (for overcommit).
> @@ -6272,12 +6262,63 @@ struct cgroup_subsys memory_cgrp_subsys = {
> * for next usage. This part is intentionally racy, but it's ok,
> * as memory.low is a best-effort mechanism.
Although it's a different issue but since this updates the docs I'm
mentioning it -- we treat memory.min the same, i.e. it's subject to the
same race, however, it's not meant to be best effort. I didn't look into
outcomes of potential misaccounting but the comment seems to miss impact
on memory.min protection.
> @@ -6292,52 +6333,29 @@ enum mem_cgroup_protection mem_cgroup_protected(struct mem_cgroup *root,
> [...]
> + if (parent == root) {
> + memcg->memory.emin = memcg->memory.min;
> + memcg->memory.elow = memcg->memory.low;
> + goto out;
> }
Shouldn't this condition be 'if (parent == root_mem_cgroup)'? (I.e. 1st
level takes direct input, but 2nd and further levels redistribute only
what they really got from parent.)
Michal
[-- Attachment #2: script --]
[-- Type: text/plain, Size: 2867 bytes --]
% run as: octave-cli script
%
% Input configurations
% -------------------
% E parent effective protection
% n nominal protection of siblings set at the givel level
% c current consumption -,,-
% example from effective_protection 3.
E = 2;
n = [3 1 0 10];
c = [2 2 2 0]; % this converges to [1.16 0.84 0 0]
% c = [6 2 2 0]; % keeps ratio [1.5 0.5 0 0]
% c = [5 2 2 0]; % mixed ratio [1.45 0.55 0 0]
% c = [8 2 2 0]; % mixed ratio [1.53 0.47 0 0]
% example from effective_protection 5.
%E = 2;
%n = [1 0];
%c = [2 1]; % coming from close to equilibrium -> [1.50 0.50]
%c = [100 100]; % coming from "infinity" -> [1.50 0.50]
%c = [2 2]; % coming from uniformity -> [1.33 0.67]
% example of recursion by default
%E = 2;
%n = [0 0];
%c = [2 1]; % coming from disbalance -> [1.33 0.67]
%c = [100 100]; % coming from "infinity" -> [1.00 1.00]
%c = [2 2]; % coming from uniformity -> [1.00 1.00]
% example by using infinities (_without_ recursive protection)
%E = 2;
%n = [1e7 1e7];
%c = [2 1]; % coming from disbalance -> [1.33 0.67]
%c = [100 100]; % coming from "infinity" -> [1.00 1.00]
%c = [2 2]; % coming from uniformity -> [1.00 1.00]
% Reclaim parameters
% ------------------
% Minimal reclaim amount (GB)
cluster = 4e-6;
% Reclaim coefficient (think as 0.5^sc->priority)
alpha = .1
% Simulation parameters
% ---------------------
epsilon = 1e-7;
timeout = 1000;
% Simulation loop
% ---------------------
% Simulation assumes siblings consumed the initial amount of memory (w/out
% reclaim) and then the reclaim starts, all memory is reclaimable, i.e. treated
% same. It simulates only non-low reclaim and assumes all memory.min = 0.
ch = [];
eh = [];
rh = [];
for t = 1:timeout
% low_usage
u = min(c, n);
siblings = sum(u);
% effective_protection()
protected = min(n, c); % start with nominal
e = protected * min(1, E / siblings); % normalize overcommit
% recursive protection
unclaimed = max(0, E - siblings);
parent_overuse = sum(c) - siblings;
if (unclaimed > 0 && parent_overuse > 0)
overuse = max(0, c - protected);
e += unclaimed * (overuse / parent_overuse);
endif
% get_scan_count()
r = alpha * c; % assume all memory is in a single LRU list
% 1bc63fb1272b ("mm, memcg: make scan aggression always exclude protection")
sz = max(e, c);
r .*= (1 - (e+epsilon) ./ (sz+epsilon));
% uncomment to debug prints
e, c, r
% nothing to reclaim, reached equilibrium
if max(r) < epsilon
break;
endif
% SWAP_CLUSTER_MAX
r = max(r, (r > epsilon) .* cluster);
c = max(c - r, 0);
ch = [ch ; c];
eh = [eh ; e];
rh = [rh ; r];
endfor
t
c, e
plot([ch, eh])
pause()
next prev parent reply other threads:[~2020-02-21 17:10 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-19 20:07 [PATCH v2 0/3] mm: memcontrol: recursive memory protection Johannes Weiner
2019-12-19 20:07 ` [PATCH v2 1/3] mm: memcontrol: fix memory.low proportional distribution Johannes Weiner
2020-01-30 11:49 ` Michal Hocko
2020-02-03 21:21 ` Johannes Weiner
2020-02-03 21:38 ` Roman Gushchin
2019-12-19 20:07 ` [PATCH v2 2/3] mm: memcontrol: clean up and document effective low/min calculations Johannes Weiner
2020-01-30 12:54 ` Michal Hocko
2020-02-21 17:10 ` Michal Koutný [this message]
2020-02-25 18:40 ` Johannes Weiner
2020-02-26 16:46 ` Michal Koutný
2020-02-26 19:40 ` Johannes Weiner
2019-12-19 20:07 ` [PATCH v2 3/3] mm: memcontrol: recursive memory.low protection Johannes Weiner
2020-01-30 17:00 ` Michal Hocko
2020-02-03 21:52 ` Johannes Weiner
2020-02-10 15:21 ` Johannes Weiner
2020-02-11 16:47 ` Michal Hocko
2020-02-12 17:08 ` Johannes Weiner
2020-02-13 7:40 ` Michal Hocko
2020-02-13 13:23 ` Johannes Weiner
2020-02-13 15:46 ` Michal Hocko
2020-02-13 17:41 ` Johannes Weiner
2020-02-13 17:58 ` Johannes Weiner
2020-02-14 7:59 ` Michal Hocko
2020-02-13 13:53 ` Tejun Heo
2020-02-13 15:47 ` Michal Hocko
2020-02-13 15:52 ` Tejun Heo
2020-02-13 16:36 ` Michal Hocko
2020-02-13 16:57 ` Tejun Heo
2020-02-14 7:15 ` Michal Hocko
2020-02-14 13:57 ` Tejun Heo
2020-02-14 15:13 ` Michal Hocko
2020-02-14 15:40 ` Tejun Heo
2020-02-14 16:53 ` Johannes Weiner
2020-02-14 17:17 ` Tejun Heo
2020-02-17 8:41 ` Michal Hocko
2020-02-18 19:52 ` Johannes Weiner
2020-02-21 10:11 ` Michal Hocko
2020-02-21 15:43 ` Johannes Weiner
2020-02-25 12:20 ` Michal Hocko
2020-02-25 18:17 ` Johannes Weiner
2020-02-26 17:56 ` Michal Hocko
2020-02-21 17:12 ` Michal Koutný
2020-02-21 18:58 ` Johannes Weiner
2020-02-25 13:37 ` Michal Koutný
2020-02-25 15:03 ` Johannes Weiner
2020-02-26 13:22 ` Michal Koutný
2020-02-26 15:05 ` Johannes Weiner
2020-02-27 13:35 ` Michal Koutný
2020-02-27 15:06 ` Johannes Weiner
2019-12-19 20:22 ` [PATCH v2 0/3] mm: memcontrol: recursive memory protection Tejun Heo
2019-12-20 4:06 ` Roman Gushchin
2019-12-20 4:29 ` Chris Down
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200221171024.GA23476@blackbody.suse.cz \
--to=mkoutny@suse.com \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=guro@fb.com \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).