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


8

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

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

我已经尝试设置rss和data限制/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.