/proc/pid/smapsでプロセスメモリ使用量に関する情報を取得する

/proc/pid/smapsでプロセスメモリ使用量に関する情報を取得する

の指定されたプロセスに対して/proc/<pid>/smaps指定されたマップ項目に対して、次の操作を行います。

  1. 共有_クリーン
  2. 共有_汚い
  3. 個人清掃
  4. 個人_汚い

Shared_Clean+Shared_Dirty他のプロセスとメモリ量を共有しますか?それでは、RSSを共有するのと同じですか?

同じPrivate_Clean+Private_Dirtyメモリ量1つのプロセスでのみ機能します。?それでは、プライベートRSSのようなものですか?

PSS値=PrivateRSS+(SharedRSS/共有するプロセス数)?

このリンクを読んだ後でも、まだいくつかの質問があります。貯水温網

それでは、プロセス全体について話しましょう。 smapsエントリを見てみましょう。

プロセスの各smapsエントリに対してShared_Clean++++をShared_Dirty実行すると、報告されたプロセスのRSSを取得できることがわかりました。これはとても素敵なことです。例えばPrivate_CleanPrivate_Dirtyps

ps -p $$ -o pid,rss

/proc/$$/smapsの各Shared_Cleanエントリの合計と(ほぼ)同じRSS値を提供します。Shared_DirtyPrivate_CleanPrivate_Dirty

しかし、PSSはどうですか?全体のプロセスについて?それでは、上記の例で$$のPSSをどのように取得できますか?各smapsマップにPSSエントリを追加し、$$にPSSにアクセスできますか?

米海軍はどうですか?全体のプロセスについて?上記の例を再度使用すると、各smapsエントリにPrivate_*エントリを追加するだけで、$$でUSSにアクセスできるようになります。そうですか?

注:
PSS =比例セットサイズ。
USS=ユニークなスーツサイズ。

答え1

クリーンページは、マッピング後に変更されていないページです。通常、共有ライブラリのテキスト部分はディスクからのみ読み取られ(必要に応じて)変更されないため、共有クリーンページに配置されます。
ダーティページは、クリーンではない(つまり変更された)ページです。

プライベートページはそのプロセスでのみ使用でき、共有ページは他のプロセスによってマッピングされます*

RSSは、現在のプロセスにマップされているページの総数です(共有の有無にかかわらず)。したがって、 Shared_Clean+はShared_DirtyRSSの共有部分(つまり、他のプロセスのRSS部分にもマッピングされます)、Private_Clean+はPrivate_DirtyRSSのプライベート部分(つまり、このプロセスにのみマッピングされます)です。

PSS(Proportional Share Size)は、あなたが説明するものとまったく同じです。プライベートページは、各共有マップのサイズをそれらを共有するプロセスの数で割ったまま集計されます。
したがって、あるプロセスに100,000ページのプライベートページがあり、500,000ページが別のプロセスと共有され、500,000ページが別のプロセス4つと共有される場合、PSSは次のようになります。

100k + (500k / 2) + (500k / 5) = 450k

追加資料:

全体のコースについて:

  • 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
...

関連情報