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 \ --subject='Re: [PATCH v2 2/3] mm: memcontrol: clean up and document effective low/min calculations' \ /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
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).