Thread (8 messages) 8 messages, 4 authors, 2015-08-05

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

From: Jerome Marchand <hidden>
Date: 2015-07-29 11:56:46
Also in: lkml

On 07/29/2015 12:30 PM, Minchan Kim wrote:
Hi Jerome,

On Wed, Jul 29, 2015 at 10:33:53AM +0200, Jerome Marchand wrote:
quoted
On 06/15/2015 03:06 PM, Minchan Kim wrote:
quoted
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).
Ok. I didn't imagine CoW pages would represent such a big share of
swapped out pages.
quoted
quoted
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
quoted
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.
Sure.
Thanks.
  

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help