[英]Monitor memory usage of child process
我有一個Linux守護程序,該守護程序派生了幾個孩子並監視它們的崩潰(根據需要重新啟動)。 如果父級可以監視子進程的內存使用情況,則可以很好-檢測內存泄漏並在超出特定大小時重新啟動子進程。 我怎樣才能做到這一點?
您應該能夠從/ proc / {PID} / status中獲取詳細的內存信息:
Name: bash
State: S (sleeping)
Tgid: 6053
Pid: 6053
PPid: 6050
TracerPid: 0
Uid: 1007 1007 1007 1007
Gid: 1007 1007 1007 1007
FDSize: 256
Groups: 1007
VmPeak: 48076 kB
VmSize: 48044 kB
VmLck: 0 kB
VmHWM: 4932 kB
VmRSS: 2812 kB
VmData: 2232 kB
VmStk: 84 kB
VmExe: 832 kB
VmLib: 6468 kB
VmPTE: 108 kB
Threads: 1
SigQ: 0/8190
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001010
SigCgt: 0000000188020001
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 0f
Mems_allowed: 00000000,00000001
voluntary_ctxt_switches: 69227121
nonvoluntary_ctxt_switches: 19071
但是,除非內存泄漏非常嚴重,否則很難從進程統計信息中檢測到它們,因為malloc和free通常是從它們所對應的系統調用(brk / sbrk)中抽象出來的。
您還可以檢入/ proc / $ {PID} / statm。
您可以嘗試讓監視腳本與進程並行運行vmstat(請注意,如果您多次運行此腳本,這將不是一個好主意,因為您將獲得多個vmstat副本)。 然后,此監視腳本可以占用可用內存,再加上緩沖區和高速緩存大小,以獲取操作系統可用的內存量,您可以對其進行跟蹤。 然后,如果該閾值低於某個閾值,則可以通過調用ps -e -o ...檢查最大的進程(有關詳細信息,請參見手冊頁,但嘗試以vsz,pcpu,user,pid,args為起點)。
我建議將此監視器作為一個單獨的進程運行,並在它變得太大時殺死惡意進程。 您可以使用
-u user-name
ps的參數。
不過,這全都是駭客(UK意思)-正確的解決方案是,假設您有代碼,則修復漏洞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.