Re: [RFC] Shared page accounting for memory cgroup

From: KAMEZAWA Hiroyuki
Date: Wed Jan 20 2010 - 02:46:28 EST


On Wed, 20 Jan 2010 16:15:33 +0900
Daisuke Nishimura <nishimura@xxxxxxxxxxxxxxxxx> wrote:
> > I would agree with you if you add interfaces to show some hints to users about above values,
> > but "shared_usage_in_bytes" doesn't meet it at all.
> >
> This is just an idea(At least, we need interfaces to read and reset them).
>
seems atractive but there is no way to decrement this counter in _scalable_ way.
We need some inovation to go this way.

But I doubt how this comes to be useful.

In general, we can assume
- file is shared. (because of their nature.)
- rss is private. (because of thier nature.)

Then, the problem is how rss(private anon) is shared.
Except for crazy progam as AIM7, rss is private in many case.
Even if highly shared, in most case, shared rss can be estimated by the size
of parent process's rss. And processe's parent-child relationship is appearent.
Measurement is easy. If COW is troublesome, counting # of COW per process
is reasonable way. (But you have to fight with the cost of adding that.)

I tend not to disagree to add a counter to show "shared with other cgroup"
but disagree "shared between process".

Thanks,
-Kame


> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 385e29b..bf601f2 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -83,6 +83,8 @@ enum mem_cgroup_stat_index {
> used by soft limit implementation */
> MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out.
> used by threshold implementation */
> + MEM_CGROUP_STAT_SHARED_IN_GROUP,
> + MEM_CGROUP_STAT_SHARED_FROM_OTHERS,
>
> MEM_CGROUP_STAT_NSTATS,
> };
> @@ -1707,8 +1709,25 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *mem,
>
> lock_page_cgroup(pc);
> if (unlikely(PageCgroupUsed(pc))) {
> + struct mem_cgroup *charged = pc->mem_cgroup;
> + struct mem_cgroup_stat *stat;
> + struct mem_cgroup_stat_cpu *cpustat;
> + int cpu;
> + int shared_type;
> +
> unlock_page_cgroup(pc);
> mem_cgroup_cancel_charge(mem);
> +
> + stat = &charged->stat;
> + cpu = get_cpu();
> + cpustat = &stat->cpustat[cpu];
> + if (charged == mem)
> + shared_type = MEM_CGROUP_STAT_SHARED_IN_GROUP;
> + else
> + shared_type = MEM_CGROUP_STAT_SHARED_FROM_OTHERS;
> + __mem_cgroup_stat_add_safe(cpustat, shared_type, 1);
> + put_cpu();
> +
> return;
> }
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/