[英]Why global array (initialized) in C is not totally counted as PSS
环境:gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:45:15 UTC 2015 i686 i686 i686
C 代码 a2.c:有一个 40MB 的全局数组,每一项都被赋值。
int b[10000000];//40M global array
void main() {
int i = 0;
for(i = 0; i<10000000; i++) {b[i]=i;}
while(1);
}
我像gcc -o a2 a2.c
一样构建
当我运行这段代码,看到smap文件cat /proc/25739/smaps
,内容如下
08048000-08049000 r-xp 00000000 08:11 46930087 /home/jzd/test/a2
Size: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 4 kB
Private_Dirty: 0 kB
Referenced: 4 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd ex mr mw me dw
//here I hide some sections
0804b000-0a670000 rw-p 00000000 00:00 0
Size: 39060 kB
Rss: 39060 kB // the RSS is the global array's size
Pss: 2196 kB // the array is only used by the program
// why it's pss is not equal with rss
Shared_Clean: 0 kB // all shared size is 0
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 39060 kB
Referenced: 39060 kB
Anonymous: 39060 kB
AnonHugePages: 36864 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac
//here I hide other sections
为什么会这样?
您启用了对透明大页面 (THP) 的支持,并且您的可执行文件的 BSS 由大页面支持:
0804b000-0a670000 rw-p 00000000 00:00 0
Size: 39060 kB
Rss: 39060 kB
Pss: 2196 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 39060 kB
Referenced: 39060 kB
Anonymous: 39060 kB
AnonHugePages: 36864 kB <------
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac
如果仔细观察,报告的Pss
值 2196 KiB 正是由常规 4 KiB 页面支持的匿名内存映射量,即Anonymous
和AnonHugePages
之间的差异。
我的猜测是 PSS 中的 THP 会计在 3.16.0-30-generic 中被打破。 在您的内核版本和smaps
内核版本之间,有几个提交影响了生成smaps
文件( fs/proc/task_mmu.c
)内容的 Linux 内核部分,更具体地说,可能在 3.18 和 3.19 之间发生这种变化固定的东西。
我不确定您为什么会看到,我运行了您的测试程序并得到了不同的结果,与您的预期一致:
00602000-02c27000 rw-p 00000000 00:00 0
Size: 39060 kB
Rss: 39060 kB
Pss: 39060 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 39060 kB
Referenced: 38824 kB
Anonymous: 39060 kB
AnonHugePages: 8192 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
我的内核版本是3.19.0-30-generic #34-Ubuntu SMP
。 您确定您正在按照发布的方式运行该程序吗? 内核内存报告也可能在某个时候发生了变化,或者这种行为取决于内核的构建方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.