Proc

當程序即將終止時,/proc/pid/status 中的記憶體使用資訊失去

  • February 12, 2019

為了跟踪我的程序的記憶體使用情況,我編寫了一個腳本,每 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

我想知道為什麼會發生這種情況,以及當我的程序即將終止時如何收集記憶體使用數據?

帶有記憶體資訊的最後一條記錄程序終止之前的最後一次記憶體使用數據。當一個程序退出時,它會在核心中經歷一個相對較長的過程,並且在結束之前“很長時間”停止它的記憶體記帳。在那之後,在這個過程完全消失之前,還有許多清理階段需要經過;但一旦發生/proc/.../status就不再顯示任何記憶體資訊。

引用自:https://unix.stackexchange.com/questions/500212