是否可以对进程的内存消耗施加某种软限制?

lef*_*out 11 linux memory swap

我认为这不是一个不常见的问题:一个进程分配了大量内存(可能是由于内存泄漏错误,因为您尝试处理一个不可行的大输入文件,或者其他什么)。RAM 已满,在某些时候 Linux 必须切换到交换。好吧,有时这只是最后的手段:如果我有一个昂贵的计算,我不想在最后我用完 RAM 时丢失数据。

然而,更常见的是(根据我的经验),内存消耗是不受限制的,通过一个流氓,也许是有缺陷的过程。即,我不仅最终将一些不太急需的数据移动到交换,而且操作系统被迫紧急交换数据负载。不幸的是,这不仅严重破坏了违规过程,而且可以使整个系统几乎陷入停顿(在带有 SSD 的机器上它不再那么糟糕了,但是 OTOH 它让我担心是否可以写入千兆字节和千兆字节的垃圾数据长期损害闪存单元)。
直到我发现问题并手动终止进程(实际上花了几分钟才让我自己登录到虚拟终端!),我的一半运行会话处于交换状态,我需要等待一段时间直到系统运行平稳再次。

这个问题有一个强大的解决方案:强制执行硬内存限制。但是在系统范围内执行此操作有时会杀死我仍然需要的进程,并且如果我必须ulimit在启动违规进程之前手动执行...好吧,我经常会忘记,直到为时已晚。

我会更满意的可能解决方案类型:

  • 如果任何进程超过一定的内存使用量,它就会被人为地节流下来,以便系统的其余部分保持响应。
  • 如果任何进程超过了一定的内存使用量,它就会被SIGSTOPped,所以我有时间弄清楚下一步该做什么。
  • 如果进程接近 RAM 限制,我会在大交换开始之前收到警告。

有没有办法获得这种行为或类似行为?

Ole*_*nge 6

niceload --noswap yourprg正是为这种情况而设计的:它查看交换活动:

  • 如果换出:让进程运行
  • 如果换入:让进程运行
  • 如果换入和换出:暂停进程直到交换停止并在交换停止时恢复进程

它不会在交换开始之前挂起进程,而是让交换运行 1 秒然后再执行。

niceload --mem 1G yourprg工作原理类似:如果可用空间少于 1GB,则暂停。当超过 1GB 可用时,您的prg 将恢复。


D.Z*_*Zou -1

清除缓存的 Cronjob:如何在 Linux 中清除内存缓存

我其实也有类似的问题。我有一群用户运行他们自己的自定义脚本,他们的脚本偶尔会消耗所有可用内存并导致 Redhat 服务器瘫痪。大量消耗 RAM 的原因是,他们的脚本可以运行数天,只是等待一个事件,从而在实际上没有使用任何资源时占用资源。所以我所做的只是简单地用 cronjob 强制清除缓存,从那以后就没有出现问题了。

简单又懒惰。