3

プロセスのメモリ使用量は、以下を実行することで表示できます。

$ ps -C processname -o size
 SIZE
 3808

ps実行(または外部プログラム)や読み取りを行わずにこの情報を取得する方法はあります/procか?

4

2 に答える 2

7

Linux システムでは、プロセスのメモリ使用量は を読み取ることで照会できます/proc/[pid]/statm[pid]プロセスの PID はどこにありますか。プロセスが自身のデータを照会したい場合は、代わりに読み取ることで実行できます/proc/self/statmman 5 proc言います:

/proc/[pid]/statm

          Provides information about memory usage, measured in pages.  The
          columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

でファイルを開きfopen("/proc/self/statm", "r")、内容を読むことができます。

ファイルは「ページ」で結果を返すため、ページ サイズも確認する必要があります。getpagesize ()ページのサイズをバイト単位で返します。

于 2012-08-16T09:09:07.150 に答える
0

プログラムのメモリ使用量を見つけるには、いくつかのオプションがあります。

  • Valgrind や memprof などのプロファイラー内で実行します。
  • exec/proc_open/fork 新しいプロセスを使用するpstop、またはpmapコマンド ラインから行うように
  • psをアプリにバンドルして直接使用します (もちろんオープンソースです!)
  • システムを使用する(とにかく、/procこれですべてです...)ps
  • プロセスのメモリ操作を監視するカーネルのレポートを作成します。ファイルシステムは、カーネルの内部データ構造への/procビューにすぎないため、これは実際には既に行われています。
  • カーネルの支援なしでメモリ使用量を計算する独自のメカニズムを開発します。

前者はすべてシステム管理の観点から教育的であり、実際の状況では最良の選択肢ですが、最後の箇条書きはおそらく最も興味深いものです。おそらく、Valgrind または memprof のソースを読んで動作を確認したいと思うでしょうが、基本的に必要なことは、アプリとカーネルの間にメカニズムを挿入し、メモリ割り当ての要求をインターセプトすることです。さらに、プロセスの開始時に、そのメモリ空間を 0xDEADBEEF などのプリセット値で初期化する必要があります。次に、プロセスが終了した後、メモリ空間を読み込んで、事前に設定した値以外の単語の出現回数を数えることで、メモリ使用量の見積もりを得ることができます。

もちろん、物事は常に見かけよりも複雑です。共有ライブラリが使用するメモリはどうですか? パイプ?プロセスと別のプロセスの間でメモリを共有していますか? システムコール?割り当てられたが使用されていない仮想メモリ? ディスクにバッファリングされたデータ? あなたの質問「プロセスの記憶」を超えて、多くの呼び出しが行われます。その他の懸念事項については、この投稿を参照してください。

于 2012-08-16T15:17:12.097 に答える