On Tue, Aug 23, 2022 at 1:21 PM Michal Hocko <mhocko@xxxxxxxx> wrote: > > On Tue 23-08-22 10:31:57, Zhaoyang Huang wrote: > > On Mon, Aug 22, 2022 at 7:31 PM Michal Hocko <mhocko@xxxxxxxx> wrote: > > > > > > On Fri 19-08-22 07:10:26, Tejun Heo wrote: > > > > On Fri, Aug 19, 2022 at 10:08:59AM -0700, Shakeel Butt wrote: > > > > > On Fri, Aug 19, 2022 at 9:29 AM Tejun Heo <tj@xxxxxxxxxx> wrote: > > > > > > > > > > > > On Fri, Aug 19, 2022 at 07:29:22PM +0800, zhaoyang.huang wrote: > > > > > > > From: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxx> > > > > > > > > > > > > > > It is observed in android system where per-app cgroup is demanded by freezer > > > > > > > subsys and part of groups require memory control. The hierarchy could be simplized > > > > > > > as bellowing where memory charged on group B abserved while we only want have > > > > > > > group E's memory be controlled and B's descendants compete freely for memory. > > > > > > > This should be the consequences of unified hierarchy. > > > > > > > Under this scenario, less efficient memory reclaim is observed when comparing > > > > > > > with no memory control. It is believed that multi LRU scanning introduces some > > > > > > > of the overhead. Furthermore, page thrashing is also heavier than global LRU > > > > > > > which could be the consequences of partial failure of WORKINGSET mechanism as > > > > > > > LRU is too short to protect the active pages. > > > > > > > > > > > > > > A(subtree_control = memory) - B(subtree_control = NULL) - C() > > > > > > > \ D() > > > > > > > - E(subtree_control = memory) - F() > > > > > > > \ G() > > > > > > > > > > > > > > Signed-off-by: Zhaoyang Huang <zhaoyang.huang@xxxxxxxxxx> > > > > > > > > > > > > Just in case it wasn't clear. > > > > > > > > > > > > Nacked-by: Tejun Heo <tj@xxxxxxxxxx> > > > > > > > > > > > > Thanks. > > > > > > > > > > > > > > > > Was there a previous discussion on this? The commit message is unreadable. > > > > > > > > http://lkml.kernel.org/r/1660298966-11493-1-git-send-email-zhaoyang.huang@xxxxxxxxxx > > > > > > Even that discussion doesn't really explain the real underlying problem. > > > There are statements about inefficiency and trashing without any further > > > details or clarifications. > > I would like to quote the comments from google side for more details > > which can also be observed from different vendors. > > "Also be advised that when you enable memcg v2 you will be using > > per-app memcg configuration which implies noticeable overhead because > > every app will have its own group. For example pagefault path will > > regress by about 15%. And obviously there will be some memory overhead > > as well. That's the reason we don't enable them in Android by > > default." > > This should be reported and investigated. Because per-application memcg > vs. memcg in general shouldn't make much of a difference from the > performance side. I can see a potential performance impact for no-memcg > vs. memcg case but even then 15% is quite a lot. Less efficiency on memory reclaim caused by multi-LRU should be one of the reason, which has been proved by comparing per-app memcg on/off. Besides, theoretically workingset could also broken as LRU is too short to compose workingset. > > > > My very vague understanding is that the Android system would like to > > > freeze specific applications and for that it requires each application > > > to live in its own cgroup. This clashes with a requirement to age and > > > reclaim memory on a different granularity (aka no per process reclaim). > > > So in fact something that cgroup v1 would achieve by having 2 > > > hierarchies, one for the freezer which would have a dedicated cgroup for > > > each application and the other for the memory controller where tasks are > > > grouped by a different criteria. This would rule out that a global (or > > > any external memory pressure) reclaim would age LRUs that contain a mix > > > bag of application pages rather than iterate over per-application LRUs. > > > Is that understanding correct? > > Correct, this is just our confusion. Besides, we believe that charge > > the pages to implicit memory enabled parent control group doesn't make > > sense as the memory cannot be managed at all. > > I do not get that part. The parent can manange and control the memory > usage so how come it cannot be managed at all? What I mean is the kind of parent which is enabled implicitly by enabling on its sibling group like belowing hierarchy. Imagine that C has no intention of memory control but has to be enabled as B would have it. IMO, it doesn't make sense to charge C1's memory.current to C until an explicitly echo "+memory" > C/subtree_control. A----B---B1 \ C---C1 > -- > Michal Hocko > SUSE Labs