これ以外にも同様の質問があり、ここで同じ質問に答えて、Linux proc statvminfoが現在どのように正確でないかを人々に知らせます。
Valgrindは詳細情報を表示できますが、ターゲットアプリケーションの速度が大幅に低下し、ほとんどの場合、アプリの動作が変わります。
WRTの「メモリ使用量」について誰もが知りたいのは次のことだと思います...
Linuxでは、1つのプロセスが使用する可能性のある物理メモリの量は大きく次のカテゴリに分類できます。
- Ma匿名マップトメモリ
- .pプライベート
- .d汚れ==malloc/マップされたヒープとスタックに割り当てられて書き込まれたメモリ
- .c clean == malloc / mmappedヒープおよびスタックメモリが割り当てられ、書き込まれ、解放されますが、まだ再利用されていません
- .s共有
- .d汚れ==何もないはずです
- .cclean==存在しないはずです
- マップトメモリという名前のMn
- .pプライベート
- .d汚れ==ファイルmmapされた書き込みメモリプライベート
- .cclean==マップされたプログラム/ライブラリテキストプライベートマップ
- .s共有
- .d汚れ==ファイルのmmapされた書き込みメモリ共有
- .cclean==マップされたライブラリテキスト共有マップされた
オーバーヘッドを最小限に抑えて実数を取得するには、次のように数値を取得することをお勧めします。
psがRSSとして表示するものを分割し、混乱しないように、より正確な数値を取得するには、これらを合計する必要があります。
/ proc /(pid)/ statusはこれらの番号を表示しようとしますが、失敗します。
したがって、[anon]、[stack]に各マッピングに正しくラベルを付ける代わりに、Linuxカーネルの人々がprocエントリコードをメインライン化して、これらのMapd、Mapc、Mnpd、....の数値を合計して表示することを望みます。
組み込みLinuxの人々は本当に幸せな私見を得るでしょう。
マップ:
awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
Mapc:
awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
Mnpd:...など