の指定されたプロセスに対して/proc/<pid>/smaps
指定されたマップ項目に対して、次の操作を行います。
- 共有_クリーン
- 共有_汚い
- 個人清掃
- 個人_汚い
Shared_Clean
+Shared_Dirty
他のプロセスとメモリ量を共有しますか?それでは、RSSを共有するのと同じですか?
同じPrivate_Clean
+Private_Dirty
メモリ量1つのプロセスでのみ機能します。?それでは、プライベートRSSのようなものですか?
PSS値=PrivateRSS+(SharedRSS/共有するプロセス数)?
このリンクを読んだ後でも、まだいくつかの質問があります。貯水温網
それでは、プロセス全体について話しましょう。 smapsエントリを見てみましょう。
プロセスの各smapsエントリに対してShared_Clean
++++をShared_Dirty
実行すると、報告されたプロセスのRSSを取得できることがわかりました。これはとても素敵なことです。例えばPrivate_Clean
Private_Dirty
ps
ps -p $$ -o pid,rss
/proc/$$/smapsの各Shared_Clean
エントリの合計と(ほぼ)同じRSS値を提供します。Shared_Dirty
Private_Clean
Private_Dirty
しかし、PSSはどうですか?全体のプロセスについて?それでは、上記の例で$$のPSSをどのように取得できますか?各smapsマップにPSSエントリを追加し、$$にPSSにアクセスできますか?
米海軍はどうですか?全体のプロセスについて?上記の例を再度使用すると、各smapsエントリにPrivate_*エントリを追加するだけで、$$でUSSにアクセスできるようになります。そうですか?
注:
PSS =比例セットサイズ。
USS=ユニークなスーツサイズ。
答え1
クリーンページは、マッピング後に変更されていないページです。通常、共有ライブラリのテキスト部分はディスクからのみ読み取られ(必要に応じて)変更されないため、共有クリーンページに配置されます。
ダーティページは、クリーンではない(つまり変更された)ページです。
プライベートページはそのプロセスでのみ使用でき、共有ページは他のプロセスによってマッピングされます*。
RSSは、現在のプロセスにマップされているページの総数です(共有の有無にかかわらず)。したがって、 Shared_Clean
+はShared_Dirty
RSSの共有部分(つまり、他のプロセスのRSS部分にもマッピングされます)、Private_Clean
+はPrivate_Dirty
RSSのプライベート部分(つまり、このプロセスにのみマッピングされます)です。
PSS(Proportional Share Size)は、あなたが説明するものとまったく同じです。プライベートページは、各共有マップのサイズをそれらを共有するプロセスの数で割ったまま集計されます。
したがって、あるプロセスに100,000ページのプライベートページがあり、500,000ページが別のプロセスと共有され、500,000ページが別のプロセス4つと共有される場合、PSSは次のようになります。
100k + (500k / 2) + (500k / 5) = 450k
追加資料:
- ELC:アプリケーションは実際にどのくらいのメモリを消費しますか?
Documentation/filesystems/proc.txt
カーネルソースコードからman proc(5)
- Linuxメモリ管理の概要
- メモリ管理TLDP.orgから
- Linux MM
全体のコースについて:
RSS
(約+)の項目を合計して取得できます(共有/個人の共有/ダーティ項目を合計する必要はありません)。Rss:
smaps
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
Pss:
process-globalを取得するには、同じ方法で値を集計できますPSS
。USS
には報告されていませんが、smaps
実際にはプライベートマップの合計なので、同じ方法で得ることもできます。
*「共有可能」ページは、共有されるまでプライベートマップと見なされます。実際に共有。つまり、現在1つのプロセスのみを使用している場合、libfoo
ライブラリのテキスト部分はそのプロセスのプライベートマッピング。ライブラリを使用して他のプロセスが開始された場合にのみ、共有マップから計算され、プライベートマップから削除されます。
+すべてのプロセスの値が正確に合計されるわけではありません。なぜなのかわかりませんが…申し訳ありません。
答え2
最近のカーネルには、/proc/$PID/smaps_rollup
プロセス全体のすべてのマッピングの概要が含まれています(参照:https://docs.kernel.org/filesystems/proc.html)。たとえば、
Rss: 640096 kB
Pss: 463041 kB
Pss_Dirty: 400291 kB
Pss_Anon: 378836 kB
Pss_File: 62264 kB
Pss_Shmem: 21941 kB
Shared_Clean: 195048 kB
Shared_Dirty: 9560 kB
Private_Clean: 38748 kB
Private_Dirty: 396740 kB
Referenced: 640024 kB
Anonymous: 378836 kB
...