2010-05-02 75 views
5

我有一個Linux守護進程,它分出幾個子進程並監視它們是否崩潰(根據需要重新啓動)。 如果父母可以監視子進程的內存使用情況 - 檢測內存泄漏並在超出特定大小時重新啓動子進程,那將會很好。 我該怎麼做?監視子進程的內存使用情況

回答

4

你應該能夠得到內存的詳細信息出來的/ proc/{PID} /狀態:

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。

+0

有沒有系統調用來做到這一點?解析文件似乎是一種非常骯髒的方式來獲取信息。 – 2010-05-02 22:09:05

+1

這是PS和朋友如何獲得他們的信息... – WhirlWind 2010-05-02 23:38:45

+0

所以我想這是最好的方法。謝謝! – 2010-05-03 08:57:13

1

你可以嘗試讓一個運行vmstat的監視腳本與你的進程並行運行(注意,如果你多次運行這個腳本,你會得到多個vmstat拷貝,這不是一個好主意)。然後這個監視器腳本可以使用可用內存加緩衝區和緩存大小來獲取操作系統可用的內存量,並且可以跟蹤它。然後,如果低於某個閾值,您可以通過調用ps -e -o來檢查最大的進程(請參閱手冊頁以獲取詳細信息,但嘗試vsz,pcpu,user,pid,args作爲起點)。

我建議將該監視器作爲一個單獨的進程運行,並在惡意進程變得過大時將其殺死。您可以將通過使用參數

-u user-name 

參數的參數限制爲ps。

儘管這是所有黑客(英國的含義),但正確的解決方案是修復泄漏,假設你有代碼。

+0

我更喜歡不依賴外部程序/腳本的集成解決方案。當然修復內存泄漏是正確的做法,但在現實世界中,您有時不得不暫時妥協。另外,我可以設想當你運行不受你控制的外部代碼時(例如運行php腳本的apache)。 – 2010-05-02 22:10:53

+0

單一集成解決方案的問題在於它變得越來越複雜。使單獨的程序執行單獨的功能的優點是每個程序都相對簡單並且易於調試和部署。一個集成的解決方案起初看起來不錯(沒有通信問題,你知道它正在運行,因爲主程序正在運行等),但隨着系統變得越來越大,簡單性問題將變得越來越重要 – Nick 2010-05-03 04:26:31

相關問題