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: >> 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). Ok. I didn't imagine CoW pages would represent such a big share of swapped out pages. > >> >>> >>> 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. Sure. > > Thanks. >
Attachment:
signature.asc
Description: OpenPGP digital signature