内存不足时系统挂起


34

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

当系统内存不足时,它将变得无响应:执行切换到TTY1甚至移动鼠标指针之类的操作需要花费几秒钟/分钟。有时,看起来好像系统冻结了:三年前,我不理会它,到目前为止什么都没有改变。

我宁愿避免在此eeePC上创建交换分区/文件,因为磁盘已经很小,而且因为交换空间上的大量写入操作会大大缩短闪存卡的寿命。此外,我认为交换文件/分区只会解决问题,而不是绝对解决问题。

内核内存不足时,不是应该杀死一些随机应用程序吗?为什么这样做会失败(或花费很多时间)?

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


1
您在设置中使用什么DE / WM,正在运行什么服务/守护程序?例如,使用完整的桌面环境并使用Chromium或Firefox浏览会占用您的RAM以便早午餐。1GB的RAM应该足以运行Arch Linux本身,但真正重要的是放在它上面。

1
我正在使用LXDE。Chromium是通常占用大部分RAM的程序。无论如何,这不是重点。不是我必须关心我的系统使用了多少内存,不是我应该因此而死掉的系统。如果我的系统内存不足,可以随意终止它想要的任何应用程序,我只是希望它不冻结
peoro 2012年

6
我的意思是,我认真考虑运行一个这样的脚本(在伪代码): while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }。这肯定会解决我的问题。但是,等等,内核不是应该这样做吗(并且比我的脚本要好得多)?它为什么不做自己的工作?
peoro 2012年

2
@Marcin,只会解决问题,不会解决。即使我有4GB的内存(由于进行了一些交换),我的系统也可能用完了内存(因此已挂起)。我要避免的是当系统内存不足时系统冻结。如果我的内核一旦结束,内核就会突然杀死铬,那么即使现在有了1GB,我也会很高兴。
peoro 2012年

4
@Lee“ magic sysrq”是直接进入内核的组合键。即使键盘和鼠标无响应,这也通常会起作用。参见en.wikipedia.org/wiki/Magic_SysRq_key
拉曼

Answers:


14

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

SysRq-F

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

OOM杀手杀死某些进程,并且系统再次变得响应。

Thx Raman在上面的评论中对此功能提供了建议。

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


2
我有钥匙PrtScn|SysRq。但是按SysRq - F一下只会得到一个屏幕截图
Lee

2
由于您基本上已经接受了我的评论并做出了回答,因此,将其归因于一个很小的贡献就可以了。无论如何,我支持你。:-)
拉曼

3
@Lee您必须启用它。有些发行版默认没有启用magic sysrq。这应该会有所帮助:google.ca/search?
拉曼

2
@Raman我敢打赌,有99%的人发现默认情况下无法“启用”,因为他们的计算机已被冻结...为什么默认情况下未启用它?
themihai

3
@themihai,因为许多人认为它存在安全风险-它使您可以通过对输入设备的物理访问来直接访问内核,而不管应用程序的状态如何,例如锁定屏幕等。
拉曼

12

事物的自然状态是应用程序数据位于RAM中,文件位于磁盘中。
从性能角度来看,理想的状态是,经常使用的数据位于RAM中,而当前不需要的数据位于磁盘中。
在正常系统上,内核会做两件事来尝试达到这一理想:

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

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

在没有交换的系统上,有时应用程序数据几乎会使用所有RAM,因此几乎没有剩余空间可用于缓存。那么系统可能会变慢。内核直到真正需要时才开始终止应用程序。只要应用程序仅填充99%的可用内存,系统就会继续运行,但运行速度非常缓慢,因为必须始终从磁盘加载和重新加载文件数据。在运行相同应用程序的情况下,此时交换将使系统更快。

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

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


1
感谢您的解释和链接,他们帮助清除了一些有关交换的疑问。在@Marcin回答我的问题之后,我在RAM中设置了256MB的压缩虚拟交换(compcache)。但是,这并不能完全回答我的问题:我知道当整个RAM仅由应用程序使用并且不缓存任何内容时,我的系统会很慢;当我完全没有内存时,我仍然不明白为什么这个系统挂了几分钟/几小时(可能永远挂了)。我认为,如果3个小时不足以切换到TTY1,则内核在内存不足时不会执行其杀死应用程序的工作。
peoro 2012年

我已禁用了32GB的物理内存的交换功能,并且当不良软件因内存分配而无法运行时(您好ld,您是一块垃圾),它仍然挂起将近一分钟,唤醒时刚好让我将难以置信的笨拙鼠标移动了一秒钟或每隔几秒钟两次。Linux的OOM处理是完全废话。幸运的是,OOM​​杀手可以杀死正确的进程,而不会完全破坏桌面环境。我是Linux的忠实拥护者。启用分页会更糟。Linux分页是一个笑话。
doug65536

6

自2007年以来,这是一个已知的错误-请参阅由于高内存使用而导致系统冻结

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


2
在Ubuntu中似乎是“未分配的”。也许DE应该警告用户,甚至冻结占用大量内存的应用程序?
nkkollaw

1
@nbrogi-除了默默冻结之外,什么都没有。但是,有幸说服Ubuntu开发人员做到这一点。
Dan Dascalescu

6

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

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

我还听说过一些替代方案,例如Facebook的OOMD,它是为在其服务器上运行而开发的,但是我还没有尝试过

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.