PSS(proportional set size) accounting in smaps]
PATCH 1/1 PSS(proportional set size) accounting in smaps]
I keep forgetting to check that you are on the cc. My email client loves dropping you from the to/cc list.
-------- Original Message --------
Subject: Re: [PATCH] PSS(proportional set size) accounting in smaps
Date: Tue, 14 Aug 2007 10:56:12 +0530
From: Balbir Singh <[email protected]>
Reply-To: [email protected]
Organization: IBM
To: Andrew Morton <[email protected]>, Matt Mackall <[email protected]>, John Berthels <[email protected]>, linux-kernel <[email protected]>
References: <[email protected]>
Quoted 9 lines · Fengguang Wu
The "proportional set size" (PSS) of a process is the count of pages it has in memory, where each page is divided by the number of processes sharing it. So if a process has 1000 pages all to itself, and 1000 shared with one other process, its PSS will be 1500.
- lwn.net: "ELC: How much memory are applications really using?"The PSS proposed by Matt Mackall is a very nice metic for measuring an process's memory footprint. So collect and export it via /proc/<pid>/smaps.
Quoted 6 lines
Matt Mackall's pagemap/kpagemap and John Berthels's exmap can also do the job, providing pretty much details. But for PSS, let's do it in a simple way.
Cc Matt Mackall <[email protected]>Cc John Berthels <[email protected]>Signed-off-by Fengguang Wu <[email protected]>
I like the idea of moving towards PSS. I had sent some patches back in December last year
http://marc.info/?l=linux-mm&m=116738715329816&w=4
Quoted 23 lines
--- fs/proc/task_mmu.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)fs/proc/task_mmu.c +2
-0@@ -319,6 +319,7 @@ const struct file_operations proc_maps_ostruct mem_size_stats {unsigned long resident; +u64 pss;/* proportional set size: my share of rss */ unsigned long shared_clean;unsigned long shared_dirty;unsigned long private_clean;@@ -341,6 +342,7 @@ static int smaps_pte_range(pmd_t *pmd, upte_t *pte, ptent;spinlock_t *ptl;struct page *page; +int mapcount; pte =pte_offset_map_lock (vma->vm_mm, pmd, addr, &ptl);for (; addr != end; pte++, addr +=PAGE_SIZE ) {
fs/proc/task_mmu.c static int smaps_pte_range(pmd_t *pmd, u · line 363
Quoted 6 lines
fs/proc/task_mmu.c +2
-1@@ -357,16 +359,19 @@ static int smaps_pte_range(pmd_t *pmd, u/* Accumulate the size in pages that have been accessed. */ if (pte_young (ptent) ||PageReferenced (page)) mss->referenced +=PAGE_SIZE ; -if (page_mapcount (page) >=2 ) { + mapcount =page_mapcount (page); +if (mapcount >=2 ) {
This accounting is of-course racy. Mapcount can change any moment.
Quoted 28 lines
fs/proc/task_mmu.c +4
-1if (pte_dirty (ptent)) mss->shared_dirty +=PAGE_SIZE ;else mss->shared_clean +=PAGE_SIZE ; + mss->pss += (PAGE_SIZE <<12 ) / mapcount; }else {if (pte_dirty (ptent)) mss->private_dirty +=PAGE_SIZE ;else mss->private_clean +=PAGE_SIZE ; + mss->pss += (PAGE_SIZE <<12 ); } }pte_unmap_unlock (pte -1 , ptl);@@ -395,18 +400,20 @@ static int show_smap(struct seq_file *m, seq_printf(m, "Size: %8lu kB\n" "Rss: %8lu kB\n" + "Pss: %8lu kB\n" "Shared_Clean: %8lu kB\n" "Shared_Dirty: %8lu kB\n" "Private_Clean: %8lu kB\n" "Private_Dirty: %8lu kB\n" "Referenced: %8lu kB\n", (vma->vm_end - vma->vm_start) >> 10, - sarg.mss.resident >> 10, + sarg.mss.resident >> 10,
fs/proc/task_mmu.c static int show_smap(struct seq_file *m, · line 419
Quoted 10 lines
fs/proc/task_mmu.c +2
-1+ (unsigned long )(mss->pss >>22 ), sarg.mss.shared_clean >>10 , sarg.mss.shared_dirty >>10 , sarg.mss.private_clean >>10 , sarg.mss.private_dirty >>10 , - sarg.mss.referenced >> 10); + sarg.mss.referenced >> 10);return ret; }
If we are reasonably sure that mapping will not change at the time of page_rmap_xxxxx() operations, we could handle shared accounting at those points and implement accurate shared accounting.
Signature · 4 lines
Warm Regards, Balbir Singh Linux Technology Center IBM, ISTL
Re: [PATCH] PSS(proportional set size) accounting in smaps
Quoted 2 lines · Balbir Singh
I keep forgetting to check that you are on the cc. My email client loves dropping you from the to/cc list.
hehe, sorry for my crappy smtp server ;)
Quoted 13 lines
Quoted 12 lines · Fengguang Wu
The "proportional set size" (PSS) of a process is the count of pages it has in memory, where each page is divided by the number of processes sharing it. So if a process has 1000 pages all to itself, and 1000 shared with one other process, its PSS will be 1500.
- lwn.net: "ELC: How much memory are applications really using?"The PSS proposed by Matt Mackall is a very nice metic for measuring an process's memory footprint. So collect and export it via /proc/<pid>/smaps.
Matt Mackall's pagemap/kpagemap and John Berthels's exmap can also do the job, providing pretty much details. But for PSS, let's do it in a simple way.
Quoted 8 lines
Quoted 3 lines
Cc Matt Mackall <[email protected]>Cc John Berthels <[email protected]>Signed-off-by Fengguang Wu <[email protected]>I like the idea of moving towards PSS. I had sent some patches back in December last year
Thank you. That's a pretty comprehensive work.
Quoted 5 lines
Review
Quoted 3 lines
(quoted diff) +2
-1- if (page_mapcount(page) >= 2) { + mapcount = page_mapcount(page); + if (mapcount >= 2) {This accounting is of-course racy. Mapcount can change any moment.
Sure it is: I never expect to provide accurate numbers. The mapcount here is to prevent divide-by-zero errors.
Quoted 3 lines
If we are reasonably sure that mapping will not change at the time of
page_rmap_xxxxx()operations, we could handle shared accounting at those points and implement accurate shared accounting.
That would be desirable, if only we can keep the cost low ;)