/proc/<pid>/smaps
の特定のプロセスの場合、特定のマッピングエントリの内容は次のとおりです。
Shared_Clean
+ Shared_Dirty
は、他のプロセスと共有されているメモリの量ですか?つまり、共有RSSのようなものですか?
同様に、Private_Clean
+ Private_Dirty
は、1つのプロセスのみが使用できるメモリの量ですか?それはプライベートRSSのようなものですか?
PSS値= PrivateRSS +(SharedRSS /それを共有するプロセスの数)ですか?
このリンクを読んだ後のいくつかの質問: [〜#〜] lwn [〜#〜]
それでは、プロセス全体について話しましょう。そのsmapsエントリは私たちが見ているものです。
プロセスのすべてのsmapsエントリに対してShared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
を実行すると、ps
、かなりクールです。例えば.
ps -p $$ -o pid,rss
/ proc/$$/smapsのすべてのShared_Clean
、Shared_Dirty
、Private_Clean
、Private_Dirty
エントリの合計とrssの(ほぼ)同じ値を取得します.
しかし、プロセス全体の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(比例配分サイズ)は、あなたが説明したとおりです。プライベートページはそのまま合計され、各共有マッピングのサイズは、それを共有するプロセスの数で除算されます。
したがって、プロセスに100kのプライベートページ、500kページが他の1つのプロセスと共有され、500kが他の4つのプロセスと共有されている場合、PSSは次のようになります。
_100k + (500k / 2) + (500k / 5) = 450k
_
さらに読む:
Documentation/filesystems/proc.txt
_ カーネルソース内man proc(5)
プロセス全体の合計について:
RSS
は(約)+)smaps
の_Rss:
_エントリを合計して取得します(共有/プライベートの共有/ダーティエントリを合計する必要はありません)。
_awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
_
Pss:
_値を合計して、プロセスグローバルPSS
を取得できます。USS
はsmaps
では報告されませんが、実際にはプライベートマッピングの合計なので、同じ方法で取得できます。*「共有可能な」ページは、実際に実際に共有されるまで、プライベートマッピングとしてカウントされます。つまり、現在libfoo
を使用しているプロセスが1つだけの場合、そのライブラリのテキストセクションは、プロセスのprivateマッピングに表示されます。別のプロセスがそのライブラリの使用を開始した場合にのみ、共有マッピングに含まれます(プライベートマッピングからは削除されます)。
+値は、すべてのプロセスに対して正確に加算されるわけではありません。なぜだかよくわかりません...ごめんなさい。