代码之家  ›  专栏  ›  技术社区  ›  Jerub

找出内存占用大小

  •  1
  • Jerub  · 技术社区  · 14 年前

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

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

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

    但是第三方库陷入了内存分配的困境,busylop失败并重新请求内存。所以我希望能够在线程中轮询进程内存的当前大小。

    我使用的语言是python,但是任何编程语言的解决方案都可以翻译成python代码,前提是它在Linux上是可行和明智的。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Paul Rubel    14 年前

    Monit 是可以运行以监视外部进程的服务。您需要做的只是将PID转储到一个文件中,以便monit读取。人们经常使用它来监视他们的Web服务器。monit可以做的测试之一是总内存使用情况。您可以设置一个值,如果您的进程使用了太多的内存,它将重新启动。下面是一个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 
    
        2
  •  1
  •   Jerub    14 年前

    这就是我想出的代码。似乎工作正常,避免了太多的字符串解析。我解包的变量名来自 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)
    
        3
  •  0
  •   Yann Ramin    14 年前

    您可以使用 /proc 文件系统。

    格式是 /proc/[pid]/status . 在 status 虚拟文件可以看到当前的vmrs(驻留内存)。