내 프로그램의 메모리 사용량을 추적하기 위해 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
더 이상 메모리 정보가 표시되지 않습니다.