Proc
當程序即將終止時,/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
我想知道為什麼會發生這種情況,以及當我的程序即將終止時如何收集記憶體使用數據?
帶有記憶體資訊的最後一條記錄是程序終止之前的最後一次記憶體使用數據。當一個程序退出時,它會在核心中經歷一個相對較長的過程,並且在結束之前“很長時間”停止它的記憶體記帳。在那之後,在這個過程完全消失之前,還有許多清理階段需要經過;但一旦發生
/proc/.../status
就不再顯示任何記憶體資訊。