我有一台 eeePC 900a:它有 8GB 闪存作为磁盘,但只有 1GB RAM。其上安装的Linux发行版是ArchLinux。
当系统内存不足时,它会变成极其无响应:需要几秒钟/几分钟才能执行诸如切换到 TTY1 甚至移动鼠标指针之类的操作。有时看起来系统就冻结了:三年前我就不管它了,到目前为止没有任何改变。
我宁愿避免在此 eeePC 上创建交换分区/文件,因为磁盘已经那么小,而且交换空间上的大量写入会大大缩短闪存卡的寿命。此外,我认为交换文件/分区只会转移问题,而不是绝对解决问题。
内核不是应该在内存不足时杀死一些随机应用程序吗?为什么它会失败(或需要很长时间)?
几个月/几年前,我已经尝试进一步研究这一点,但找不到任何实际有效的东西......
答案1
可以通过键盘组合直接调用OOM-killer(内存不足杀手):
SysRq-F
SysRq 键通常与键盘上的 PrtSc 键组合在一起。
OOM-killer 杀死一些进程,系统再次响应。
感谢 Raman 在上面的评论中提供有关此功能的建议。
PS:这对我帮助很大。我同意这样的观点:如果该问题是由 Chrome 或任何贪婪内存的软件引起的,那么这是关于该问题的最有用的建议。但您需要记住,OOM-killer 可能会杀死一些非常重要的进程,请谨慎使用。
答案2
最近我找到了解决我的问题的方法。
由于 Linux OOM Killer 无法正常工作,我开始使用用户空间 OOM Killer:早间。它是用 C 语言编写的,相当可配置,对我来说就像一个魅力。
我还听说过一些替代方案,例如Facebook 的 OOMD,开发为在他们的服务器上运行,但我还没有尝试过这个
答案3
事物的自然状态是应用程序数据位于 RAM 中,文件位于磁盘上。
从性能角度来看,理想的状态是经常使用的数据位于 RAM 中,而当前不需要的数据位于磁盘上。
在正常的系统上,内核会做两件事来尝试达到这个理想状态:
- 一段时间没有使用的应用程序数据可以移动到磁盘:这就是交换。
- 最近使用过的文件中的数据保存在 RAM 中:这是磁盘缓存(用于从磁盘读取的数据)和磁盘缓冲区(用于即将写入磁盘的数据)。
在典型的系统上,RAM 的很大一部分专用于高速缓存和缓冲区(典型数字为 50%)。由于 RAM 是有限的资源,这可能需要替换一些应用程序数据以进行交换(仅当有更好的方法来使用 RAM 时才需要交换)。
在没有交换的系统中,当应用程序数据使用几乎所有的 RAM 时,就会出现这种情况,因此几乎没有任何空间用于缓存。然后系统可能会变慢。内核不会开始终止应用程序,直到它真的不得不这样做。只要应用程序只占用 99% 的可用内存,系统就会继续运行,但速度会非常慢,因为文件数据必须一直从磁盘加载和重新加载。在运行相同的应用程序的情况下,此时使用交换的系统会更快。
有关此问题的更多信息,请参阅这个 lkml 讨论和这篇博文。
我不知道有什么直接方法可以告诉内核为磁盘缓存保留最小数量的 RAM。你可以将 RAM 的一小部分设置为交换空间,也许甚至压缩的。有这方面的成功报告,尽管我对您的具体情况不做任何保证。
答案4
这是自 2007 年以来的一个已知错误 - 请参阅内存使用率过高时系统冻结。
在这种情况下,Windows 会显示一个对话框,警告用户关闭一个或多个应用程序。