2012-03-29 5 views
15
私は、PSSの欄について混乱して

は/ proc/PID/smapsので、私はそれをテストするためにプログラムを書いた:は/ proc/PID/smaps

void sa(); 
int main(int argc,char *argv[]) 
{ 
    int fd; 
    sa(); 
    sleep(1000); 
} 

void sa() 
{ 
    char *pi=new char[1024*1024*10]; 
    for(int i=0;i<4;++i) { 
     for(int j=0;j<1024*1024;++j){ 
       *pi='o'; 
       pi++; 
     } 
    } 
    int cnt; 
    for(int i=0;i<6;++i) { 
     for(int j=0;j<1024*1024;++j){ 
       cnt+=*pi; 
       pi++; 
     } 
    } 
    printf("%d",cnt); 
} 

$cat /proc/`pidof testprogram`/smaps 

08838000-0885b000 rw-p 00000000 00:00 0   [heap] 
Size:    140 kB 
Rss:     12 kB 
Pss:     12 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  12 kB 
Referenced:   12 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
b6dcd000-b77d0000 rw-p 00000000 00:00 0 
Size:    10252 kB 
Rss:    10252 kB 
Pss:    4108 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  4108 kB 
Referenced:   4108 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

私はPrivate_Dirtyに等しいpssを見つけましたが、なぜ私は不思議です。

ご連絡先:smapsの詳細な文書はありますか?プロセスの

答えて

27

lwn.net

から引用「比例セットサイズ」(PSS)は、各ページがそれを共有 プロセスの数で割ってメモリに有しているページ のカウントです。プロセスは、それ自体に1000ページのすべてを持っているのであれば、 と1000が一つの他のプロセスと共有し、そのPSSはメモリを示すマップに基づいて拡張、Linux Kernel Documentationから1500

/proc/PID/smapsをされるだろうプロセスのそれぞれのマッピングのための消費量は、 です。そこにマッピング のそれぞれについて、次のような一連の線である:

08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
Size:    1084 kB 
Rss:     892 kB 
Pss:     374 kB 
Shared_Clean:  892 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:   0 kB 
Referenced:   892 kB 
Anonymous:    0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
Locked:    374 kB 

これらの行の最初のの/ proc/PID /マップにマッピングするための 表示されるのと同じ情報を示します。残りの行は、マッピングのサイズ (サイズ)、現在RAMに 常駐(RSS)、このマッピング (PSS)のプロセスの比例共有されているマッピングの量、表示しますマッピング内のきれいで汚いプライベートページの数 MAP_SHAREDマッピングの一部であるが、 しかマップされていないページ、つまり1つのプロセスによって現在使用されているページであっても、 は非公開であり共有としては扱われないことに注意してください。 "Referenced"は、現在参照またはアクセスされているとマークされたメモリの量を示す を示します。 「匿名」は、 ファイルに属していないメモリ量を示します。ファイルに関連付けられたマッピングであっても、匿名の ページが含まれている場合があります。MAP_PRIVATEとページが変更された場合、ファイルページは になります。 "スワップ"は、匿名のメモリでもあるが がどれくらい使用されているのかを示していますが、スワップ時に出力されます。

This QuestionUnix and Linux Stackexchangeはほとんどのトピックを網羅しています。確かにすべての疑問をクリアするMatの優れた答えを見てください。

+0

バイナリでスマップを実行すると、なぜ多くのPSSが表示されますか?ここにバイナリロックの出力があります。0 kB 77afd000-77afe000 r -p 00007000 00:0e 20581089 /lib/ld-uClibc-0.9.33.2.so。実際にバイナリが使用するサイズを計算するために、すべてのPSSを追加する必要がありますか。このサイズはRAMに占有されているサイズと同じですか? サイズ:4キロバイトのRss:4キロバイト:PSS 4キロバイトPrivate_Dirty:4キロバイト参考:4キロバイト 匿名:4キロバイト AnonHugePages:0 kBの 77ab2000-77ad6000 R-XP 00000000 00:0E 20711467/USR/LIB/libdbus- glib-1.so.2.2.0 サイズ:144 kB Rss:112 kB Pss:12 kB –