mm: why cat /proc/pid/smaps | grep Rss is different from cat /proc/pid/statm?
[root@localhost c_test]# cat /proc/3948/smaps | grep Rss
Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 796 kB Rss: 0 kB Rss: 16 kB Rss: 8 kB Rss: 12 kB Rss: 132 kB Rss: 12 kB Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 12 kB Rss: 0 kB Rss: 4 kB Rss: 0 kB
[root@localhost c_test]# cat /proc/3948/statm
1042 173 154 1 0 48 0
173 means Rss is 173*4kb=692kb, right?
so why it is different from the sum(1020kb) of "cat /proc/pid/smaps | grep Rss"?
my test code is
...
int main()
{
sleep(1000);
return 0;
}the kernel version is v4.1
Thanks,
Xishi Qiu
Quoted 2 lines · Xishi Qiu
[root@localhost c_test]# cat
/proc/3948/smaps| grep Rss
The /proc/[pid]/smaps read triggers the traversal of all of process's vmas and then page tables and accumulate RSS on each present page table entry.
[root@localhost c_test]# cat /proc/3948/statm
Quoted 2 lines
1042 173 154 1 0 48 0
The files /proc/[pid]/statm and /proc/[pid]/status uses the counters (MM_ANONPAGES & MM_FILEPAGES) in mm_struct to report RSS of a process. These counters are modified on page table modifications. However the kernel implements an optimization where each thread keeps a local copy of these counters in its task_struct. These local counter are accumulated in the shared counter of mm_struct after some number of page faults (I think 32) faced by the thread and thus there will be mismatch with smaps file.
Shakeel
Quoted 5 lines · Shakeel Butt
On Tue, Mar 22, 2016 at 6:55 AM, Xishi Qiu <[email protected] <mailto:[email protected]>> wrote:
[root@localhost c_test]# cat
/proc/3948/smaps| grep Rss
Quoted 8 lines
The /proc/[pid]/smaps read triggers the traversal of all of process's vmas and then page tables and accumulate RSS on each present page table entry.
[root@localhost c_test]# cat /proc/3948/statm 1042 173 154 1 0 48 0The files /proc/[pid]/statm and /proc/[pid]/status uses the counters (
MM_ANONPAGES&MM_FILEPAGES) inmm_structto report RSS of a process. These counters are modified on page table modifications. However the kernel implements an optimization where each thread keeps a local copy of these counters in itstask_struct. These local counter are accumulated in the shared counter ofmm_structafter some number of page faults (I think 32) faced by the thread and thus there will be mismatch with smaps file.Shakeel
Hi Shakeel,
I malloc and memset 10M, then sleep. It seems that the problem is still exist, the kernel version is v4.1
[root@localhost c_test]# cat /proc/13746/statm 3603 2767 250 1 0 2609 0
[root@localhost c_test]# cat /proc/13746/smaps | grep Rss
Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 10244 kB Rss: 924 kB Rss: 0 kB Rss: 16 kB Rss: 8 kB Rss: 12 kB Rss: 132 kB Rss: 12 kB Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 4 kB Rss: 8 kB Rss: 0 kB Rss: 4 kB Rss: 0 kB
Quoted 7 lines · Xishi Qiu
Quoted 5 lines · Shakeel Butt
On Tue, Mar 22, 2016 at 6:55 AM, Xishi Qiu <[email protected] <mailto:[email protected]>> wrote:
[root@localhost c_test]# cat
/proc/3948/smaps| grep Rss
Quoted 9 lines
Quoted 8 lines
The /proc/[pid]/smaps read triggers the traversal of all of process's vmas and then page tables and accumulate RSS on each present page table entry.
[root@localhost c_test]# cat /proc/3948/statm 1042 173 154 1 0 48 0The files /proc/[pid]/statm and /proc/[pid]/status uses the counters (
MM_ANONPAGES&MM_FILEPAGES) inmm_structto report RSS of a process. These counters are modified on page table modifications. However the kernel implements an optimization where each thread keeps a local copy of these counters in itstask_struct. These local counter are accumulated in the shared counter ofmm_structafter some number of page faults (I think 32) faced by the thread and thus there will be mismatch with smaps file.Shakeel
Hi Shakeel,
I misunderstand your meaning before. I know the reason now.
Thanks,
Xishi Qiu
Quoted 5 lines
Hi Shakeel,
I malloc and memset 10M, then sleep. It seems that the problem is still exist, the kernel version is v4.1