/proc/<pid>/smaps
内の特定のプロセスについて 、特定のマッピングエントリについて:
- Shared_Clean
- Shared_Dirty
- Private_Clean
- Private_Dirty
Shared_Clean
です + Shared_Dirty
他のプロセスと共有されるメモリの量は?つまり、共有RSSのようなものですか?
同様にPrivate_Clean
+ Private_Dirty
1つのプロセスでのみ使用可能なメモリの量 ?プライベートRSSのようなものですか?
PSS値=PrivateRSS+(SharedRSS /それを共有するプロセスの数)ですか?
このリンクを読んだ後、さらにいくつか質問があります:LWN
次に、プロセス全体について説明します。そのsmapsエントリを確認します。
Shared_Clean
を実行すると、気づきました + Shared_Dirty
+ Private_Clean
+ Private_Dirty
プロセスのすべてのsmapsエントリについて、
ps
によって報告されたプロセスのRSSを取得します。 、かなりかっこいいです。例:
ps -p $$ -o pid,rss
すべてのShared_Clean
の合計と(約)同じrssの値が表示されます 、Shared_Dirty
、Private_Clean
、Private_Dirty
/ proc / $$/smapsのエントリ。
しかし、PSSはどうですか プロセス全体で?したがって、上記の例から、$$のPSSを取得するにはどうすればよいですか?すべてのsmapsマッピングにPSSエントリを追加して、$$でPSSに到達できますか?
そしてUSSはどうですか プロセス全体で?上記の例をもう一度取り上げると、$$ ..rightのすべてのsmapsエントリのPrivate_*エントリのみを合計することで、$$のUSSに到達できると推測しています。
注:
PSS=比例セットサイズ。
USS=一意のセットサイズ。
承認された回答:
クリーンページとは、マップされてから変更されていないページです(通常、共有ライブラリのテキストセクションはディスクからのみ読み取られ(必要な場合)、変更されないため、共有されたクリーンページになります)。
ダーティページとは、クリーンではない(つまり、変更された)ページです。
プライベートページはそのプロセスでのみ使用でき、共有ページは他のプロセスによってマップされます。
RSSは、現在プロセスにマップされている、共有されているかどうかに関係なく、ページの総数です。したがって、Shared_Clean
+ Shared_Dirty
RSSの共有部分(つまり、他のプロセスにもマップされるRSSの部分)であり、Private_Clean
+ Private_Dirty
RSSのプライベート部分(つまり、このプロセスでのみマップされます)。
PSS(比例シェアサイズ)はあなたが説明する通りです。プライベートページはそのまま合計され、各共有マッピングのサイズは、それを共有するプロセスの数で除算されます。
したがって、プロセスに10万のプライベートページがある場合、50万ページが他のプロセスと共有され、500kが4つのプロセスと共有されます。他のプロセスの場合、PSSは次のようになります。
100k + (500k / 2) + (500k / 5) = 450k
その他の読み物:
- ELC:アプリケーションは実際にどのくらいのメモリを使用していますか?
-
Documentation/filesystems/proc.txt
カーネルソース内 -
man proc(5)
- Linuxメモリ管理の概要
- TLDP.orgでのメモリ管理
- LinuxMM
プロセス全体の合計について:
-
RSS
Rss:
を合計することで(おおよそ)取得できますsmaps
のエントリ (共有/プライベート共有/ダーティエントリを合計する必要はありません)。awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
-
Pss:
を要約できます プロセスグローバルPSS
を取得するには、同じ方法で値を設定します 。 -
USS
smaps
では報告されません 、しかし実際、これはプライベートマッピングの合計であるため、同じ方法で取得することもできます
「共有可能な」ページは、実際に になるまで、プライベートマッピングとしてカウントされることに注意してください。 共有。つまり、現在libfoo
を使用しているプロセスが1つしかない場合 、そのライブラリのテキストセクションはプロセスのプライベートに表示されます マッピング。別のプロセスがそのライブラリの使用を開始した場合にのみ、共有マッピングで考慮されます(プライベートマッピングから削除されます)。
値はすべてのプロセスで正確に合計されるわけではありません。理由はよくわかりません…ごめんなさい。