All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Davydov <vdavydov@parallels.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Michal Hocko <mhocko@kernel.org>,
	Minchan Kim <minchan@kernel.org>, Rik van Riel <riel@redhat.com>,
	Mel Gorman <mgorman@suse.de>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/3] Make workingset detection logic memcg aware
Date: Mon, 10 Aug 2015 11:14:14 +0300	[thread overview]
Message-ID: <20150810081414.GB16760@esperanza> (raw)
In-Reply-To: <55C75FC9.2060803@jp.fujitsu.com>

On Sun, Aug 09, 2015 at 11:12:25PM +0900, Kamezawa Hiroyuki wrote:
> On 2015/08/08 22:05, Vladimir Davydov wrote:
> >On Fri, Aug 07, 2015 at 10:38:16AM +0900, Kamezawa Hiroyuki wrote:
...
> >>All ? hmm. It seems that mixture of record of global memory pressure and of local memory
> >>pressure is just wrong.
> >
> >What makes you think so? An example of misbehavior caused by this would
> >be nice to have.
> >
> 
> By design, memcg's LRU aging logic is independent from global memory allocation/pressure.
> 
> 
> Assume there are 4 containers(using much page-cache) with 1GB limit on 4GB server,
>   # contaienr A  workingset=600M   limit=1G (sleepy)
>   # contaienr B  workingset=300M   limit=1G (work often)
>   # container C  workingset=500M   limit=1G (work slowly)
>   # container D  workingset=1.2G   limit=1G (work hard)
> container D can drive the zone's distance counter because of local memory reclaim.
> If active/inactive = 1:1, container D page can be activated.
> At kswapd(global reclaim) runs, all container's LRU will rotate.
> 
> Possibility of refault in A, B, C is reduced by conainer D's counter updates.

This does not necessarily mean we have to use different inactive_age
counter for global and local memory pressure. In your example, having
inactive_age per lruvec and using it for evictions on both global and
local memory pressure would work just fine.

> 
> But yes, some _real_  test are required.
> 
> >>
> >>Now, the record is
> >>a??a??a??a??
> >>a??a??a??a??eviction | node | zone | 2bit.
> >>
> >>How about changing this as
> >>
> >>         0 |eviction | node | zone | 2bit
> >>         1 |eviction |  memcgid    | 2bit
> >>
> >>Assume each memcg has an eviction counter, which ignoring node/zone.
> >>i.e. memcg local reclaim happens against memcg not against zone.
> >>
> >>At page-in,
> >>         if (the 1st bit is 0)
> >>                 compare eviction counter with zone's counter and activate the page if needed.
> >>         else if (the 1st bit is 1)
> >>                 compare eviction counter with the memcg (if exists)
> >
> >Having a single counter per memcg won't scale with the number of NUMA
> >nodes.
> >
> It doesn't matter, we can use lazy counter like pcpu counter because it's not needed to be very accurate.

Fair enough.

> 
> 
> >>                 if (current memcg == recorded memcg && eviction distance is okay)
> >>                      activate page.
> >>                 else
> >>                      inactivate
> >>At page-out
> >>         if (global memory pressure)
> >>                 record eviction id with using zone's counter.
> >>         else if (memcg local memory pressure)
> >>                 record eviction id with memcg's counter.
> >>
> >
> >I don't understand how this is supposed to work when a memory cgroup
> >experiences both local and global pressure simultaneously.
> >
> 
> I think updating global distance counter by local reclaim may update counter too much.

But if the inactive_age counter was per lruvec, then we wouldn't need to
bother about it.

> Above is to avoid updating zone's counter and keep memcg's LRU active/inactive balanced.
> 
> >Also, what if a memory cgroup is protected by memory.low? Such a cgroup
> >may have all its pages in the active list, because it is never scanned.
> 
> If LRU never scanned, all file caches tend to be in INACTIVE...it never refaults.

This is not true - there still may be activations from
mark_page_accessed.

Thanks,
Vladimir

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Davydov <vdavydov@parallels.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Michal Hocko <mhocko@kernel.org>,
	Minchan Kim <minchan@kernel.org>, Rik van Riel <riel@redhat.com>,
	Mel Gorman <mgorman@suse.de>, <linux-mm@kvack.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 0/3] Make workingset detection logic memcg aware
Date: Mon, 10 Aug 2015 11:14:14 +0300	[thread overview]
Message-ID: <20150810081414.GB16760@esperanza> (raw)
In-Reply-To: <55C75FC9.2060803@jp.fujitsu.com>

On Sun, Aug 09, 2015 at 11:12:25PM +0900, Kamezawa Hiroyuki wrote:
> On 2015/08/08 22:05, Vladimir Davydov wrote:
> >On Fri, Aug 07, 2015 at 10:38:16AM +0900, Kamezawa Hiroyuki wrote:
...
> >>All ? hmm. It seems that mixture of record of global memory pressure and of local memory
> >>pressure is just wrong.
> >
> >What makes you think so? An example of misbehavior caused by this would
> >be nice to have.
> >
> 
> By design, memcg's LRU aging logic is independent from global memory allocation/pressure.
> 
> 
> Assume there are 4 containers(using much page-cache) with 1GB limit on 4GB server,
>   # contaienr A  workingset=600M   limit=1G (sleepy)
>   # contaienr B  workingset=300M   limit=1G (work often)
>   # container C  workingset=500M   limit=1G (work slowly)
>   # container D  workingset=1.2G   limit=1G (work hard)
> container D can drive the zone's distance counter because of local memory reclaim.
> If active/inactive = 1:1, container D page can be activated.
> At kswapd(global reclaim) runs, all container's LRU will rotate.
> 
> Possibility of refault in A, B, C is reduced by conainer D's counter updates.

This does not necessarily mean we have to use different inactive_age
counter for global and local memory pressure. In your example, having
inactive_age per lruvec and using it for evictions on both global and
local memory pressure would work just fine.

> 
> But yes, some _real_  test are required.
> 
> >>
> >>Now, the record is
> >>    
> >>    eviction | node | zone | 2bit.
> >>
> >>How about changing this as
> >>
> >>         0 |eviction | node | zone | 2bit
> >>         1 |eviction |  memcgid    | 2bit
> >>
> >>Assume each memcg has an eviction counter, which ignoring node/zone.
> >>i.e. memcg local reclaim happens against memcg not against zone.
> >>
> >>At page-in,
> >>         if (the 1st bit is 0)
> >>                 compare eviction counter with zone's counter and activate the page if needed.
> >>         else if (the 1st bit is 1)
> >>                 compare eviction counter with the memcg (if exists)
> >
> >Having a single counter per memcg won't scale with the number of NUMA
> >nodes.
> >
> It doesn't matter, we can use lazy counter like pcpu counter because it's not needed to be very accurate.

Fair enough.

> 
> 
> >>                 if (current memcg == recorded memcg && eviction distance is okay)
> >>                      activate page.
> >>                 else
> >>                      inactivate
> >>At page-out
> >>         if (global memory pressure)
> >>                 record eviction id with using zone's counter.
> >>         else if (memcg local memory pressure)
> >>                 record eviction id with memcg's counter.
> >>
> >
> >I don't understand how this is supposed to work when a memory cgroup
> >experiences both local and global pressure simultaneously.
> >
> 
> I think updating global distance counter by local reclaim may update counter too much.

But if the inactive_age counter was per lruvec, then we wouldn't need to
bother about it.

> Above is to avoid updating zone's counter and keep memcg's LRU active/inactive balanced.
> 
> >Also, what if a memory cgroup is protected by memory.low? Such a cgroup
> >may have all its pages in the active list, because it is never scanned.
> 
> If LRU never scanned, all file caches tend to be in INACTIVE...it never refaults.

This is not true - there still may be activations from
mark_page_accessed.

Thanks,
Vladimir

  reply	other threads:[~2015-08-10  8:14 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-03 12:04 [PATCH 0/3] Make workingset detection logic memcg aware Vladimir Davydov
2015-08-03 12:04 ` Vladimir Davydov
2015-08-03 12:04 ` [PATCH 1/3] mm: move workingset_activation under lru_lock Vladimir Davydov
2015-08-03 12:04   ` Vladimir Davydov
2015-08-03 12:04 ` [PATCH 2/3] mm: make workingset detection logic memcg aware Vladimir Davydov
2015-08-03 12:04   ` Vladimir Davydov
2015-08-03 13:23   ` Johannes Weiner
2015-08-03 13:23     ` Johannes Weiner
2015-08-03 13:52     ` Vladimir Davydov
2015-08-03 13:52       ` Vladimir Davydov
2015-08-03 20:55       ` Johannes Weiner
2015-08-03 20:55         ` Johannes Weiner
2015-08-04  8:13         ` Vladimir Davydov
2015-08-04  8:13           ` Vladimir Davydov
2015-08-03 12:04 ` [PATCH 3/3] mm: workingset: make shadow node shrinker " Vladimir Davydov
2015-08-03 12:04   ` Vladimir Davydov
2015-08-05  1:34 ` [PATCH 0/3] Make workingset detection logic " Kamezawa Hiroyuki
2015-08-05  1:34   ` Kamezawa Hiroyuki
2015-08-06  8:59   ` Vladimir Davydov
2015-08-06  8:59     ` Vladimir Davydov
2015-08-07  1:38     ` Kamezawa Hiroyuki
2015-08-07  1:38       ` Kamezawa Hiroyuki
2015-08-08 13:05       ` Vladimir Davydov
2015-08-08 13:05         ` Vladimir Davydov
2015-08-09 14:12         ` Kamezawa Hiroyuki
2015-08-09 14:12           ` Kamezawa Hiroyuki
2015-08-10  8:14           ` Vladimir Davydov [this message]
2015-08-10  8:14             ` Vladimir Davydov
2015-08-11 15:59             ` Kamezawa Hiroyuki
2015-08-11 15:59               ` Kamezawa Hiroyuki

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=20150810081414.GB16760@esperanza \
    --to=vdavydov@parallels.com \
    --cc=akpm@linux-foundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=mhocko@kernel.org \
    --cc=minchan@kernel.org \
    --cc=riel@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.