web-dev-qa-db-ja.com

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

/proc/<pid>/smapsの特定のプロセスの場合、特定のマッピングエントリの内容は次のとおりです。

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

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_CleanShared_DirtyPrivate_CleanPrivate_Dirtyエントリの合計とrssの(ほぼ)同じ値を取得します.

しかし、プロセス全体のPSSはどうですか?上記の例から、$$のPSSを取得するにはどうすればよいですか?すべてのsmapsマッピングのPSSエントリを追加して、$$のPSSに到達できますか?

そして、プロセス全体のUSSはどうですか?上記の例でも、$$ .. rightのすべてのsmapsエントリのPrivate_ *エントリのみを合計することで、$$のUSSに到達できると思います。

ノート:
PSS =プロポーショナルセットサイズ。
USS =固有のセットサイズ。

48
Ankur Agarwal

クリーンページは、マップされてから変更されていないページです(通常、共有ライブラリのテキストセクションは(必要な場合)ディスクからのみ読み取られ、変更されないため、共有されたクリーンページになります)。
ダーティページは、クリーンではない(つまり、変更された)ページです。

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

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
_

さらに読む:

プロセス全体の合計について:

  • RSSは(約)+smapsの_Rss:_エントリを合計して取得します(共有/プライベートの共有/ダーティエントリを合計する必要はありません)。

    _awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    _
  • 同じ方法で_Pss:_値を合計して、プロセスグローバルPSSを取得できます。
  • USSsmapsでは報告されませんが、実際にはプライベートマッピングの合計なので、同じ方法で取得できます。

*「共有可能な」ページは、実際に実際に共有されるまで、プライベートマッピングとしてカウントされます。つまり、現在libfooを使用しているプロセスが1つだけの場合、そのライブラリのテキストセクションは、プロセスのprivateマッピングに表示されます。別のプロセスがそのライブラリの使用を開始した場合にのみ、共有マッピングに含まれます(プライベートマッピングからは削除されます)。
+値は、すべてのプロセスに対して正確に加算されるわけではありません。なぜだかよくわかりません...ごめんなさい。

51
Mat