On Tue, Nov 26, 2019 at 9:16 PM Michal Hocko <mhocko@xxxxxxxxxx> wrote: > > On Tue 26-11-19 08:02:49, Yafang Shao wrote: > > There's one case that the processes in a memcg are all exit (due to OOM > > group or some other reasons), but the file page caches are still exist. > > These file page caches may be protected by memory.min so can't be > > reclaimed. If we can't success to restart the processes in this memcg or > > don't want to make this memcg offline, then we want to drop the file page > > caches. > > The advantage of droping this file caches is it can avoid the reclaimer > > (either kswapd or direct) scanning and reclaiming pages from all memcgs > > exist in this system, because currently the reclaimer will fairly reclaim > > pages from all memcgs if the system is under memory pressure. > > The possible method to drop these file page caches is setting the > > hard limit of this memcg to 0. Unfortunately this may invoke the OOM killer > > and generates lots of misleading outputs, that should not happen. > > I disagree that the output is misleading. Quite contrary, it provides a > useful lead on the unreclaimable memory. > We can show the unreclaimable memory independently, rather than print the full oom output. OOM killer is used to kill process, why do we invoke it when there's no process ? What's the advantage of doing it ? > > One misleading output is "Out of memory and no killable processes...", > > while really there is no tasks rather than no killable tasks. > > Again, this is nothing misleading. No task is a trivial subset of no > killable task. I do not see why we should treat one differently than the > other. > No killable tasks means there's task and the OOM killer may be invoked. While no tasks means the OOM killer is useless. > > Furthermore, > > the OOM output is not expected by the admin if he or she only wants to drop > > the cahes and knows there're no processes running in this memcg. > > But this is not what hard limit reduced to 0 really does. No matter > whether there is some task or not. It simply reclaims _all_ the memory > as explained in other email. > Are there any way to reclaim page cache only ? No. I know it will relcaim all the memory. If you really think this expression is a prolem, but does it improtant that we should distingush between caches (both page caches and kmem) and _all_ memory, especially when there's no processes ? > > If memcg is not populated, we should not invoke the OOM killer. > > I have already explained why I believe this is not correct in other > email and this description doesn't provide any real justification. It is > merely your intepretation of what should happen and I believe you > haven't thought through it really. > > > Fixes: b6e6edcf ("mm: memcontrol: reclaim and OOM kill when shrinking memory.max below usage") > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> > > Cc: Johannes Weiner <hannes@xxxxxxxxxxx> > > Cc: Michal Hocko <mhocko@xxxxxxxx> > > --- > > mm/memcontrol.c | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index 1c4c08b..4e08905 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -6139,9 +6139,13 @@ static ssize_t memory_max_write(struct kernfs_open_file *of, > > continue; > > } > > > > - memcg_memory_event(memcg, MEMCG_OOM); > > - if (!mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0)) > > + if (cgroup_is_populated(memcg->css.cgroup)) { > > + memcg_memory_event(memcg, MEMCG_OOM); > > + if (!mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0)) > > + break; > > + } else { > > break; > > + } > > } > > > > memcg_wb_domain_size_changed(memcg); > > -- > > 1.8.3.1 > > -- > Michal Hocko > SUSE Labs