我希望能够在使用太多内存时重启服务(这与第三方库中的错误有关)
我用它来限制可以请求的内存量:
resource.setrlimit(resource.RLIMIT_AS, (128*1024*1024, 128*1024*1024))
但第三方库卡在内存分配busyloop失败并重新请求内存。所以我希望能够在一个线程中轮询当前进程内存的大小。
我正在使用的语言是python,但任何编程语言的解决方案都可以转换为python代码,只要它在linux上可行且合理。
答案 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(常驻内存)。