私は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はプロセス(コード+データ+スタック)の仮想サイズです。
答え2
単にメモリを割り当てるだけでは十分ではありません。そのメモリを使用してアプリケーションでいくつかの値を入力しようとすると、VmRSSが大きくなります。