私のプログラムのメモリ使用量を追跡するために、0.01秒ごとに/proc/pid/statusを記録し、ここからメモリ使用量を抽出するスクリプトを作成しました。ほとんどの記録を確認してみると特に問題はありませんが、プログラムが終了しようとすると(約0.05秒程度)、最後の数回の記録でメモリ使用量に関するデータが消えてしまいます。
これは5以外の最後の記録で、すべてが正常です。
Name: problem
Umask: 0022
State: R (running)
Tgid: 1910
Ngid: 0
Pid: 1910
PPid: 1909
TracerPid: 0
Uid: 1001 1001 1001 1001
Gid: 1001 1001 1001 1001
FDSize: 64
Groups: 1001
NStgid: 1910
NSpid: 1910
NSpgid: 1909
NSsid: 1909
VmPeak: 3124988 kB
VmSize: 3124988 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 3122016 kB
VmRSS: 3122016 kB
RssAnon: 3118940 kB
RssFile: 3076 kB
RssShmem: 0 kB
VmData: 3119124 kB
VmStk: 132 kB
VmExe: 8 kB
VmLib: 3104 kB
VmPTE: 6156 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
CoreDumping: 0
Threads: 1
SigQ: 0/62912
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: vulnerable
Cpus_allowed: fff
Cpus_allowed_list: 0-11
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 0
nonvoluntary_ctxt_switches: 5
これは、メモリ使用量に関するデータが消えた4を除く最後の記録です。
Name: problem
Umask: 0022
State: R (running)
Tgid: 1910
Ngid: 0
Pid: 1910
PPid: 1909
TracerPid: 0
Uid: 1001 1001 1001 1001
Gid: 1001 1001 1001 1001
FDSize: 64
Groups: 1001
NStgid: 1910
NSpid: 1910
NSpgid: 1909
NSsid: 1909
Threads: 1
SigQ: 0/62912
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: vulnerable
Cpus_allowed: fff
Cpus_allowed_list: 0-11
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 0
nonvoluntary_ctxt_switches: 5
なぜこれが起こるのか、プログラムが終了しようとしたときにメモリ使用量データをどのように収集できるかを知りたいです。
答え1
最後に記録されたメモリ情報はいプログラム終了前の最後のメモリ使用量データです。いつプログラム終了、カーネルで比較的長いプロセスを経て、終了する前に「古い」メモリの計算を停止します。これが発生した後もプロセスが完全に消える前に行わなければならないクリーンアップステップがまだ残っていますが、そのようなことが起こったら。/proc/.../status
メモリ情報は表示されなくなりました。