2010-11-11 55 views
1

我希望能夠當它使用了太多的內存(這是在第三方庫有關的錯誤)找出內存佔用大小

我已經使用這個限制的金額,以重新啓動服務的,可以請求的內存:

resource.setrlimit(resource.RLIMIT_AS, (128*1024*1024, 128*1024*1024)) 

但第三方庫卡在內存分配失敗busyloop並重新申請內存。所以我希望能夠在一個線程中輪詢當前進程的內存大小。我使用

語言是Python,但對於任何編程語言的解決方案可以被翻譯成Python代碼,只要它是可行和明智的Linux操作系統。

+0

你能告訴我們要避免哪個庫嗎? – 2010-11-11 07:23:43

+0

哈,好電話。不,我不能。抱歉。 – Jerub 2010-11-11 07:47:01

回答

1

Monit是可以運行監控外部流程的服務。所有你需要做的就是將你的pid轉儲到一個文件中以便讀取。人們經常用它來監視他們的網絡服務器。 monit可以做的其中一項測試是用於全部內存使用情況。你可以設置一個值,如果你的進程使用了​​太多的內存,它將被重新啓動。下面是一個示例監視配置

check process yourProgram 
     with pidfile "/var/run/YOUR.pid" 
     start program = "/path/to/PROG.py" 
     stop program = "/script/to/kill/prog/kill_script.sh" 
     restart if totalmem is greater than 60.0 MB 
0

您可以使用/proc文件系統中讀取當前的內存使用情況。

格式爲/proc/[pid]/status。在status虛擬文件中,您可以看到當前的VmRSS(駐留內存)。

+0

我希望避免讀取的/ proc /自/狀態(的/ proc/self是當前運行的進程),但如果我不能做任何事情,我想我能做到這一點。 – Jerub 2010-11-11 07:40:55

1

這是我想出的代碼。似乎正常工作,並避免太多的字符串解析。變量名我解包來自proc(5)人頁面,這可能是比提取字符串解析/proc/self/status操作系統信息的更好的方法。

def get_vsize(): 
    parts = open('/proc/self/stat').read().split() 
    (pid, comm, state, ppid, pgrp, session, tty, tpgid, flags, minflt, cminflt, 
    majflt, cmajflt, utime, stime, cutime, cstime, counter, priority, timeout, 
    itrealvalue, starttime, vsize, rss, rlim, startcode, endcode, startstack, 
    kstkesp, kstkeip, signal, blocked, sigignore, sigcatch, wchan, 
    ) = parts[:35] 
    return int(vsize) 

def memory_watcher(): 
    while True: 
     time.sleep(120) 
     if get_vsize() > 120*1024*1024: 
      os.kill(0, signal.SIGTERM)