内存不足时系统挂起

peo*_*oro 47 linux memory freeze

我有一个 eeePC 900a:它有一个 8GB 的​​闪存作为磁盘,只有 1GB 的 RAM。安装在其上的 Linux 发行版是 ArchLinux。

当系统内存不足时,它会变得非常无响应:执行诸如切换到 TTY1 甚至移动鼠标指针之类的操作需要几秒钟/几分钟的时间。有时看起来系统只是冻结了:我们三个之前我就不管了,到目前为止什么都没有改变。

我宁愿避免在这台 eeePC 上创建交换分区/文件,因为磁盘已经那么小,而且交换空间上的许多写入会大大缩短闪存卡的寿命。此外,我认为交换文件/分区只会移动问题,而不是绝对修复它。

内核是否应该在内存不足时杀死一些随机应用程序?为什么这样做会失败(或需要很长时间)?

几个月/几年前,我已经尝试进一步研究这一点,但找不到任何实际可行的方法......

Ark*_*lar 16

可以通过键盘组合直接调用OOM-killer(内存不足杀手):

SysRq-F

SysRq 键通常与键盘上的 PrtSc 键组合在一起。

OOM-killer 杀死一些进程(-es),系统再次响应。

感谢 Raman 在上面的评论中提供有关此功能的建议。

PS:这对我帮助很大。我同意这样的观点,如果它是由 Chrome 或任何内存贪婪软件引起的,这是关于该问题的最有用的建议。但是您需要记住,OOM-killer 可能会杀死一些非常重要的进程,请谨慎使用。

  • @Lee 您必须启用它。一些发行版默认没有启用魔法 sysrq。这应该会有所帮助:https://www.google.ca/search?q=sysrq+enable (5认同)
  • @themihai 因为很多人认为这是一个安全风险——它使您可以通过对输入设备的物理访问直接访问内核,而不管应用程序状态如何,例如锁定屏幕等。 (3认同)
  • 我有密钥`PrtScn|SysRq`。但是按下`SysRq - F` 只能得到一个截图 (2认同)
  • 由于您基本上接受了我上面的评论并将其作为答案,因此小的归因会很好。反正我给你投了票。:-) (2认同)
  • @Raman 我敢打赌 99% 的人发现默认情况下无法“启用它”,因为他们的机器已经冻结……为什么默认情况下不启用它? (2认同)

Gil*_*il' 12

事情的自然状态是应用程序数据在 RAM 中,而文件在磁盘上。
在性能方面,理想的状态是经常使用的数据在 RAM 中,而目前不需要的数据在磁盘上。
在正常系统上,内核会做两件事来尝试达到这个理想:

  • 一段时间未使用的应用程序数据可以移动到磁盘:这就是交换。
  • 最近使用过的文件中的数据保存在 RAM 中:这是磁盘缓存(用于从磁盘读取的数据)和磁盘缓冲区(用于将要写入磁盘的数据)。

在典型系统上,RAM 的很大一部分专门用于缓存和缓冲区(50% 是典型数字)。由于 RAM 是一种有限资源,这可能需要替换一些应用程序数据以进行交换(只有在有更好的方式使用 RAM 时才需要交换)。

在没有交换的系统上,有时应用程序数据几乎使用了所有 RAM,因此几乎没有任何空间可用于缓存。那么系统很可能会变慢。内核不会开始杀死应用程序,直到它真的必须这样做。只要应用程序只填满 99% 的可用内存,系统就会继续运行,但速度非常慢,因为必须始终从磁盘加载和重新加载文件数据。运行相同的应用程序时,系统会在此时使用交换更快。

有关此问题的更多信息,请参阅此 lkml 讨论此博客文章

我不知道有什么直接的方法可以告诉内核为磁盘缓存保留最少的 RAM。您可以将 RAM 的一小部分设置为交换空间,甚至可以压缩。在这方面有成功的报告,但我对您的特定情况不做任何保证。


peo*_*oro 10

最近我找到了解决我问题的方法。

由于 Linux OOM 杀手无法正常工作,我开始使用用户空间 OOM 杀手:earlyoom。它是用 C 编写的,相当可配置,对我来说就像一个魅力。

我也听说过一些替代方案,例如Facebook 的 OOMD,开发用于在他们的服务器上运行,但我还没有尝试过这个


Dan*_*scu 7

这是自 2007 年以来的一个已知错误 - 请参阅系统冻结高内存使用率

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

  • 在 Ubuntu 中似乎是“未分配”。也许 DE 应该警告用户甚至冻结内存密集型应用程序? (3认同)