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

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

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

然而,更常见的是(根据我的经验),内存消耗是无限制的,由一个流氓,也许是有缺陷的进程造成的。即,我不仅最终得到一些不太急需的数据转移到交换,但操作系统被迫紧急交换大量数据。不幸的是,这不仅严重破坏了有问题的进程,而且可能使整个系统几乎陷入停顿(在带有SSD的机器上,情况不再那么糟糕了,但是OTOH,这让我担心写入千兆字节和千兆字节的垃圾数据是否会导致系统崩溃)长期损害闪存电池)。
直到我注意到问题并手动终止进程(有一次实际上花了几分钟才登录到虚拟终端!),我正在运行的会话有一半处于交换状态,我需要等待很长一段时间才能系统运行顺利再次。

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

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

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

有什么办法可以得到这样的行为或类似的行为吗?

答案1

Niceload --noswap yourprg就是为这种情况而设计的:它着眼于交换活动:

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

它不会在交换开始之前暂停进程,而是让交换运行 1 秒后再进行操作。

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

答案2

是的。几乎使用任何现代 shell 都可以轻松完成此操作。

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

您可以使用-l锁定内存限制选项。如果超出限制,您的进程将收到信号。

答案3

清除缓存的 Cronjob:Linux下如何清除内存缓存

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

单纯又懒惰。

相关内容