簡體   English   中英

為什么 C 中的全局數組(初始化)不完全算作 PSS

[英]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 頁面支持的匿名內存映射量,即AnonymousAnonHugePages之間的差異。

我的猜測是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM