找出内存占用量大小

时间:2010-11-11 07:19:16

标签: linux memory

我希望能够在使用太多内存时重启服务(这与第三方库中的错误有关)

我用它来限制可以请求的内存量:

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

但第三方库卡在内存分配busyloop失败并重新请求内存。所以我希望能够在一个线程中轮询当前进程内存的大小。

我正在使用的语言是python,但任何编程语言的解决方案都可以转换为python代码,只要它在linux上可行且合理。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

Monit是您可以运行以监控外部进程的服务。您需要做的就是将您的pid转储到文件中以便monit读取。人们经常使用它来监控他们的Web服务器。 monit可以做的一个测试是总内存使用量。您可以设置一个值,如果您的进程使用了​​太多内存,它将重新启动。这是一个monit config

的例子
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 

答案 2 :(得分:0)

您可以使用/proc文件系统读取当前的内存使用情况。

格式为/proc/[pid]/status。在status虚拟文件中,您可以看到当前的VmRSS(常驻内存)。