Re: [PATCH v2] mm: show proportional swap share of the mapping

From: Minchan Kim
Date: Wed Jul 29 2015 - 06:30:20 EST


Hi Jerome,

On Wed, Jul 29, 2015 at 10:33:53AM +0200, Jerome Marchand wrote:
> On 06/15/2015 03:06 PM, Minchan Kim wrote:
> > We want to know per-process workingset size for smart memory management
> > on userland and we use swap(ex, zram) heavily to maximize memory efficiency
> > so workingset includes swap as well as RSS.
> >
> > On such system, if there are lots of shared anonymous pages, it's
> > really hard to figure out exactly how many each process consumes
> > memory(ie, rss + wap) if the system has lots of shared anonymous
> > memory(e.g, android).
> >
> > This patch introduces SwapPss field on /proc/<pid>/smaps so we can get
> > more exact workingset size per process.
> >
> > Bongkyu tested it. Result is below.
> >
> > 1. 50M used swap
> > SwapTotal: 461976 kB
> > SwapFree: 411192 kB
> >
> > $ adb shell cat /proc/*/smaps | grep "SwapPss:" | awk '{sum += $2} END {print sum}';
> > 48236
> > $ adb shell cat /proc/*/smaps | grep "Swap:" | awk '{sum += $2} END {print sum}';
> > 141184
>
> Hi Minchan,
>
> I just found out about this patch. What kind of shared memory is that?
> Since it's android, I'm inclined to think something specific like
> ashmem. I'm asking because this patch won't help for more common type of
> shared memory. See my comment below.

It's normal heap of parent(IOW, MAP_ANON|MAP_PRIVATE memory which is share
by child processes).

>
> >
> > 2. 240M used swap
> > SwapTotal: 461976 kB
> > SwapFree: 216808 kB
> >
> > $ adb shell cat /proc/*/smaps | grep "SwapPss:" | awk '{sum += $2} END {print sum}';
> > 230315
> > $ adb shell cat /proc/*/smaps | grep "Swap:" | awk '{sum += $2} END {print sum}';
> > 1387744
> >
> snip
> > diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
> > index 6dee68d013ff..d537899f4b25 100644
> > --- a/fs/proc/task_mmu.c
> > +++ b/fs/proc/task_mmu.c
> > @@ -446,6 +446,7 @@ struct mem_size_stats {
> > unsigned long anonymous_thp;
> > unsigned long swap;
> > u64 pss;
> > + u64 swap_pss;
> > };
> >
> > static void smaps_account(struct mem_size_stats *mss, struct page *page,
> > @@ -492,9 +493,20 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr,
> > } else if (is_swap_pte(*pte)) {
>
> This won't work for sysV shm, tmpfs and MAP_SHARED | MAP_ANONYMOUS
> mapping pages which are pte_none when paged out. They're currently not
> accounted at all when in swap.

This patch doesn't handle those pages because we don't have supported
thoses pages. IMHO, if someone need it, it should be another patch and
he can contribute it in future.

Thanks.

--
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/