/ proc/pid/smapsのpssカラムについて混乱していたので、それをテストするプログラムを書きました。
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
ここで私はpssがPrivate_Dirtyに等しいことを発見しましたが、なぜなのかと思います。
ところで、smaps
の詳細なドキュメントはありますか?
lwn.net からの引用
プロセスの「比例セットサイズ」(PSS)は、メモリ内にあるページの数です。各ページは、それを共有するプロセスの数で除算されます。したがって、プロセスがすべて1000ページを自分自身に持ち、1000が他の1つのプロセスと共有されている場合、そのPSSは1500になります。
Linux Kernel Documentation から、
/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/mapsのマッピングで表示されるものと同じ情報を示しています。残りの行は、マッピングのサイズ(size)、現在RAM([〜#〜] rss [〜#〜])、このマッピングのプロセスの比例配分([〜#〜] pss [〜#〜])、マッピング内のクリーンおよびダーティのプライベートページの数。MAP_SHAREDマッピングの一部であるが、マッピングされた単一のpteのみを含むページであることにも注意してください。つまり、現在1つのプロセスでのみ使用され、共有ではなくプライベートとしてアカウントされます。「Referenced」は、参照またはアクセス済みとして現在マークされているメモリの量を示します。「Anonymous "は、どのファイルにも属していないメモリの量を示します。ファイルに関連付けられたマッピングでさえ、匿名のページが含まれている可能性があります:MAP_PRIVATEおよび「Swap」は、ページが変更され、ファイルページがプライベートな匿名のコピーに置き換えられた場合に、匿名になる可能性のあるメモリがどれだけ使用されているかを示します。
この質問Unix and Linux
Stackexchangeはほとんどのトピックをカバーしています。間違いなくすべての疑問を解決するマットの優れた答えをご覧ください。