簡體   English   中英

監視子進程的內存使用情況

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM