如何自动杀死泄漏内存的进程?


8

我有泄漏内存的进程的问题。它们导致我的硬盘驱动器被填充交换文件/private/var/vm

我希望操作系统可以立即泄漏泄漏的进程。我对20分钟后出现的对话框不感兴趣,建议应用程序杀死,甚至不显示泄漏的对话框。

我已经尝试设置rssdata限制/etc/launchd.conf但它似乎没有效果。

这是我的/etc/launchd.conf

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

这是launchctl limit输出:

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

这是我的.zshrc

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

ulimit -a输出(在ZSH中):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

然而,这是top告诉我这个过程的原因:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

似乎所记录的内存限制方法都没有实际起作用。我可能错过了一个额外的机制吗?


230 GiB?!我真的希望你错过了一个小数点。
duci9y 2013年

@ duci9y Nope :-(
sam hocevar 2013年

3
在这种情况下,我真的希望有人解决你的问题。你会在我的祈祷中。
duci9y 2013年

我最终删除了泄漏过程的内容,因为IRC上的人开始讲授我为什么要使用clang ++而不是llvm-g ++,这只会让我想用尖尖的对象来打它们。
sam hocevar 2013年

尖锐的物体着火了。
duci9y 2013年

Answers:


3

我将创建一个简单的脚本,它将过滤处理任何进程,其驻留内存大小(或者可能是总vm大小,因此包括任何分页页面)大于我定义的阈值(取决于进程数量,可用总内存和也许还有CPU可用性)。可以使用一些bash脚本top或者ps挖出进程和内存大小列表。

从这个过滤后的列表中,我将使用每个进程PID 的leaks命令(参见man 1 leaks)。如果命令报告的泄漏内存总量高于另一个阈值,我会杀死并重新生成它。

注意:您应该注意不要在不知道自己的操作的情况下终止任何操作系统/系统进程。为了避免这种情况,您应该使用“白名单”方法过滤掉列表。


1

大多数平台上的ulimit不能按预期工作。

如果这不是桌面应用程序,请使用适当的流程主管(例如https://github.com/arya/bluepill)运行违规者

如果这是桌面应用程序,请与应用程序开发人员联系。反馈是必要且重要的。

用于Mac的OOM杀手GUI的用户体验非常糟糕。对于每个进程的ram使用情况,它应该是最大的降序,并带有比例条形图。此外,它应该在解决时自动SIGCONT所有暂停的进程。


1
我有几个应用程序的问题,但打破骆驼背部的稻草是苹果的llvm-g++。雷达报道了这个问题。我很好奇:其他平台有什么不工作的ulimit?我已经使用了几种口味的Unix近20年了,我不记得看到了。
sam hocevar 2013年

-2

如果您需要重新启动,则应该只使用launchctl limit命令。

如果您需要限制应用程序的内存,您还应该限制堆栈段。


正如您在输出中看到的,堆栈大小和数据大小都是有限的。我问的问题,因为launchctl limit不能正常工作。
sam hocevar 2013年

ulimit你使用真的不能按你的需要工作launchctl limit确实。
Eir Nym 2013年

还有另一个需要点亮的时刻:当程序达到限制时,它会收到警告。但是软限制动作将成功执行,但是很难 - 它会失败。因此,如果程序请求内存超出硬限制,则不会分配任何内存。
Eir Nym 2013年

launchctl limit工作,否则我就不会问这个问题。
sam hocevar 2013年

你如何衡量应用程序的大小?
Eir Nym 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.