如何防止Linux在内存不足时冻结?

今天我(不小心)在我的Linux机器上跑了一些程序,很快就使用了大量的内存。 我的系统冻结,变得没有反应,因此我无法杀死罪犯。

我怎样才能防止在未来呢? 难道它不能至less保持一个响应核心或东西运行?

我敢打赌,系统实际上并没有“冻结”(就像内核挂起的那样),而只是非常没有反应。 很有可能只是交换,导致交互式性能和系统吞吐量下降。

可以closures交换,但这只是将性能改善的问题改变为OOM杀死的进程(以及所有引起的乐趣),同时由于磁盘caching的可用性降低而导致性能下降。

或者,您可以使用每个进程的资源限制(通常称为rlimit和/或ulimit )来消除单个进程占用大量内存并导致交换的可能性,但这只会将进程推向有趣的领域在不方便的时候死亡,因为他们想要的系统愿意给他们多一点的记忆。

如果你知道你要做一些可能导致大量内存使用的东西,那么你可以编写一个封装程序来完成一个mlockall()然后执行你的shell。 它会保留在内存中,并且将是您可能获得的“保持一个响应核心”的最接近的东西(因为并不是CPU被过度使用是问题所在)。

我个人认为“不要做蠢事”的资源pipe制方法。 如果你有根,你可以对系统做各种各样的损害,所以做任何你不知道可能结果的事情都是危险的事情。

如上面在Tronic的评论中提到的,可以通过键盘组合SysRqF直接调用OOM杀手(内存不足杀手)。

SysRq键通常结合在键盘上的PrtSc键中。

OOM杀手杀死一些进程(-es)并且系统再次变得响应。

PS:这帮了我很多。 我同意这个观点,如果这是由Chrome或任何内存贪婪软件造成的,这是最有用的build议。 但是你需要记住的是,OOM​​杀手可以杀死一些非常重要的过程,仔细使用它。

这是特别难以预防的事情。 这是因为内核开始交换。 一个解决scheme是closures掉。 当系统内存不足而不是开始交换时,内核会杀死一些进程; 通常它会select正确的杀死进程,但是杀死一个随机进程比反应缓慢更好。

这对服务器来说可能是一个非常好的解决scheme,因为服务器通常有足够的内存,而当他们开始使用交换空间时,这意味着什么是错误的。 但是,桌面通常需要交换空间,所以我认为桌面没有好的解决scheme。 我经常在服务器上closures交换空间,特别是当怀疑有内存泄漏的时候。

这是自2007年以来已知的一个错误 – 请参阅高内存使用情况下的系统冻结 。

在这种情况下,Windows将显示一个对话框,警告用户closures一个或多个应用程序。