/proc/$pid/status の vmRSS 値が正しくないと思いますか?なぜ?

/proc/$pid/status の vmRSS 値が正しくないと思いますか?なぜ?

私はfree、ps、top、/proc/$pid/status、/proc/$pid/smaps、/proc/$pid/statmなどのさまざまなメモリユーティリティの出力フィールドを理解するのに役立つテストプログラムを書いています。 。ついに問題が発生したがわかりません。

問題: /proc/$pid/status の vmRss フィールドは次のとおりです。いいえ、同じです。/proc/$pid/smaps で計算された値です (すべての Rss フィールドを追加して)。

前者の値は「ps」コマンドのRSS出力ソースでなければならず、後者の値は「pmap -x」コマンドのRSS出力ソースでなければなりません。

私が書いたテストプログラムは、同じプロセスで20のスレッドを作成しました。ここで、各スレッドは malloc(4*1024) を 256 回呼び出して各スレッドが 1 MB のメモリを占めるので、1MB/スレッド * 20 スレッド = 合計 20MB です。

このプログラムに基づいて、/proc/$pid/statusのVmRSS出力は次のようになります。

VmRSS:     16468 kB

psの出力と並べ替え

8941  0.0  0.1 4102600 16468 pts/22  Sl+  10:07   0:00 ./a.out

/proc/8941/smaps および pmap -x 8941 出力の合計は次のとおりです。

$ cat /proc/8941/smaps | grep Rss | awk '{print $2}' | awk '{s+=$1} END {printf "%.0f\n", s}' /dev/stdin
22536
$ pmap -x 8941 | tail -n 1
total kB         4102604   22536   20992

freeコマンドの出力により、私のプログラムが実際に20MB以上のメモリを消費していることを確信していたので、「ps」と「/proc/$pid/status」のRSS値は私にとって意味がありませんでした。

何が起こっているのかを説明できる人はいますか?よろしくお願いします。

ベストアンサー1

Linuxのマニュアルページプロジェクトを参照してください。https://www.kernel.org/doc/man-pages/。彼らはあなたが見ていることを説明できます。

この記事を書く時点(バージョン5.13)では工程(5)/proc/[pid]/statusのVmRSSが正しくないと出てきます。

VmRSS 常駐セットサイズ。ここの値は、RssAnon、RssFile、および RssShmem の合計です。この値は正確ではありません。上記の/proc/[pid]/statmをご覧ください。

proc(5) では RssAnon と RssFile が不正確なので、VmRSS も不正確でなければならないと言います。

正確な値を得るには、/proc/[pid]/smaps を参照する必要があります(マンページの /proc/[pid]/statm の下にそのように表示されます)。

そして、参考(1)説明する

SIZEおよびRSSフィールドは、ページテーブル、カーネルスタック、struct thread_info、およびstruct task_structを含むプロセスの特定の部分を計算しません。通常、少なくとも20KiBのメモリは常に常駐します。 SIZEはプロセス(コード+データ+スタック)の仮想サイズです。

おすすめ記事