如何防止运行的程序占用所有的内存和CPU资源?

我在Ubuntu的资源管理方面遇到了一个烦人的问题。经常出现一些程序,比如Google Chrome浏览器,占用100%的CPU和大部分内存。
我希望操作系统始终能够响应,这意味着我希望能够在程序之间切换,移动鼠标或者切换到tty并给操作系统发送命令。因此,我正在寻找一种方法来配置操作系统,让其保留10%的系统资源。目前Ubuntu并不是以这种方式运行,Chrome经常会占用所有的CPU和内存,导致系统无法响应,当然我不能等待超过一两分钟,所以只能长按电源按钮关机。
有没有办法让Ubuntu始终保持响应?至少能够杀掉那些耗费资源的程序吗?(我知道内核最终会杀掉一些程序来释放空间,但我希望能够强制它更快地执行或者为自身保留更多的资源)
Version: UBUNTU 14.04
~$ uname -a
Linux spielplatz 3.13.0-45-generic #74-Ubuntu SMP Tue Jan 13 19:36:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

CPU: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
RAM: 8GB

更新(2017年10月8日)

到目前为止,我找到的最佳解决方案是使用cgroups。这里有一个gist


大多数现今的程序在处理受限内存方面表现不佳。你有可用的交换空间吗? - David Foerster
你可以使用cgroups来限制内存使用和将程序限制在一组核心上。例如,参见:http://askubuntu.com/a/510936/158442 - muru
@DavidFoerster 是的,我有8GB的交换空间。 - mehdix
@muru听起来很有前途。我会在一个Python脚本上试一下,看看它的效果如何。 - mehdix
1个回答

我以前使用过cpulimit来“限制”失控的CPU占用程序(Xfce4 Mailwatch插件有时会卡住并占用100%的CPU)。cpulimit是一个:
工具,用于限制进程的CPU使用率。cpulimit是一个简单的程序,试图限制进程的CPU使用率(以百分比表示,而不是CPU时间)。这对于控制批处理作业很有用,当您不希望它们占用太多CPU时。它不影响nice值或其他优先级设置,而是影响实际的CPU使用情况。 此外,它能够动态快速地适应整个系统负载。
它通过监视目标进程,并向进程发送“SIGSTOP和SIGCONT信号,既可以验证它是否可以控制该进程,又可以限制其平均CPU消耗量。”请参阅:

这应该会使您的操作系统更加响应,但我在Firefox上尝试过,它往往会使其反应迟钝,所以对于Chrome浏览器可能不是最好的答案。寻找加速Chrome本身的方法可能更有成效。

如果您只想要一个好的方式来查看CPU和内存的使用情况,以及使用它们的进程,我建议使用系统监控程序(如tophtop,我更喜欢conky),然后当您看到某个进程占用了所有的CPU或内存时,您可以关闭/重启等操作。


如果你对于了解哪些程序首先被安排运行感兴趣,可以研究一下调度优先级和“niceness”。也许你可以让Chrome表现得更“友好”,而不会使其功能受限。
这是来自info coreutils 'nice invocation'的片段。
'好'打印出一个进程的"好感度",或者以修改过的好感度运行一个命令。"好感度"影响进程在系统中被调度的优先级。
好感度的取值范围至少从-20(进程具有较高的优先级并获得更多资源,从而减慢其他进程的速度)到19(进程具有较低的优先级并且自身运行缓慢,但对其他正在运行的进程的速度影响较小)。一些系统可能具有更广泛的好感度取值范围;相反,其他系统可能实施更严格的限制。尝试设置超出支持范围的好感度将被视为尝试使用最小或最大支持值。
好感度不应与调度优先级混淆,调度优先级允许应用程序确定线程被调度运行的顺序。与优先级不同,好感度只是对调度器的建议,调度器可以选择忽略它。此外,作为术语的一点说明,POSIX根据好感度和最小好感度之间的非负差异定义了'好'的行为。虽然'好'符合POSIX标准,但其文档和诊断信息使用"好感度"一词以保持与历史惯例的兼容性。
这里有几个关于调度的看起来很有用的链接:

而muru在评论/帖子上对Cgroups(在ArchWiki上)的看法很好,关于限制内存,看起来也可以限制CPU核心和"份额"("默认情况下,所有组都有1024个份额。具有100个份额的组将获得大约10%的CPU时间")。

ArchWiki文章的第一段也提到了这个潜在有用的选项,不过我认为它们主要用于限制用户/组,请参考:man pam_limitsman limits.conf


2我会尝试这个并回报情况,但是我仍然不明白为什么内核将几乎所有资源分配给正在运行的应用程序,导致系统无法响应,以至于我无法移动鼠标。 - mehdix
@MehdiSadeghi 我添加了一些关于日程安排和“友好性”的信息,我不确定你的系统为什么会变得无响应,但这可能有助于解释其原因。 - Xen2050