当程序即将终止时 /proc/pid/status 中的内存使用信息丢失

当程序即将终止时 /proc/pid/status 中的内存使用信息丢失

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

相关内容