为了跟踪我的程序的内存使用情况,我编写了一个脚本,每 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
不再显示任何内存信息。