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


25

今天,我(偶然地)在Linux机器上运行了一些程序,该程序很快占用了大量内存。我的系统死机了,变得反应迟钝,因此我无法杀死罪犯。

将来如何预防?它至少不能保持响应性内核或其他组件正在运行吗?


Answers:


15

我敢打赌,该系统实际上并没有“冻结”(就内核挂起而言),而是反应迟钝。可能是交换非常困难,导致交互性能和系统吞吐量下降得很困难。

可以关闭交换,但这只会将问题从性能下降变为OOM终止的进程(以及所有带来的乐趣),并且由于可用磁盘缓存较少而导致性能下降。

或者,您可以使用每个进程的资源限制(通常称为rlimit和/或ulimit)来消除单个进程占用大量内存并导致交换的可能性,但是这只会使您进入娱乐性的领域,而该进程死于不方便的时刻,因为他们想要的内存比系统愿意提供的内存多一点。

如果您知道要执行可能导致大量内存使用的操作,则可以编写一个包装程序,该程序mlockall()先执行an 然后执行外壳程序;这样可以将其保存在内存中,并且很可能是您保持“响应式内核”的最接近的方式(因为问题不在于CPU使用率过高)。

我个人赞成资源控制的“不要做愚蠢的事情”方法。如果您已经扎根,则可能会对系统造成各种损害,因此,做任何您可能不知道的可能结果都是危险的业务。


2
不幸的是,“不要做愚蠢的事情”不帮助谁运行内存占用应用程序,如Chrome浏览器用户(见问题134612393395)。
Dan Dascalescu

1
@DanDascalescu并非总是很明显您在做一些愚蠢的事情。前几天我的机器挂起,因为我将(复杂的)SQLite查询中的“ UNION”更改为“ UNION ALL”。
迈克尔

已知的越野车程序可以(并且应该)在资源受限的配置中运行- ulimit如今,甚至cgroup,如果您是时髦的年轻人,也可以很好地完成工作。如果要在生产环境中对查询进行更改而不在非关键环境中验证查询的效果,那么这就是根本原因。
womble

8

正如Tronic在上面的评论中提到的那样,可以通过键盘组合SysRq- 直接调用OOM-killer(内存不足的杀手)F

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

OOM杀手杀死某些进程,并且系统再次变得响应。默认情况下,可能无法启用直接访问OOM-killer的权限,请检查此问题以了解如何检查其状态和/或启用它。

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



0

如果您想重新编译内核,可以尝试以下问题的部分进行修补EDIThttps : //stackoverflow.com/q/52067753/10239615
它不会Active(file)在内存压力很大时逐出页面,因此它可以使OOM杀手kill之所以能够立即触发,是因为内核不再需要花费几分钟的时间从磁盘上重新读取每个进程的可执行代码页,从而导致操作系统死机。


-1

这是特别难以防止的事情。这是因为内核开始交换。一种解决方案是关闭交换。当系统内存不足,而不是开始交换时,内核将终止某些进程。通常它会选择正确的进程来杀死,但是总而言之,杀死一个随机进程要比没有响应的系统更好。

对于服务器而言,这可能是一个特别好的解决方案,因为服务器通常具有足够的RAM,并且当它们开始使用交换空间时,无论如何这都意味着有问题。但是,台式机通常需要交换空间,因此我认为台式机没有很好的解决方案。我经常关闭服务器中的交换空间,尤其是当怀疑有内存泄漏时。


4
在任何系统上关闭交换都不是一个好主意,因为它不允许交换未使用的页面以及不允许用于磁盘缓存的可用空间。这尤其是当有内存泄漏真实。
womble

2
并关闭交换功能后,由于分页,系统仍然会变慢。它将疯狂地对干净的页面进行分页,而不是脏的页面。(因为没有交换,它就永远都无法驱逐脏页,而总是必须驱逐干净的页面。)
David Schwartz 2012年

我有一台服务器发生内存泄漏。第一次发生时,我必须按下重置按钮,因为服务器没有响应。但是,既然我已关闭交换功能,则服务器会杀死apache子(如果它太大)(除了MaxRequestsPerChild之外,这也是一种保护措施)。结果是服务器可以正常运行。无论如何,它没有很多未使用的页面,并且肯定不是疯狂地分页干净的页面。
Antonis Christofides 2012年

@AntonisChristofides:我不确定您从中学到了什么。您的解决方案肯定是一个糟糕的解决方案,因为它无法从物理内存中移出很少访问的脏页,从而降低了性能,无法解决根本问题,并且冒着OOM杀手可能杀死关键进程的风险。您碰巧没有遇到我警告过的特殊危险,但是由于没有交换,您仍然处于危险之中。
大卫·史瓦兹

8
无论有无交换,它仍然会冻结,直到OOM杀手自动运行。这确实是应该修复的内核错误(即,在删除所有磁盘缓存之前,先运行OOM Killer)。不幸的是,内核开发人员和许多其他人看不到这个问题。常见的建议(例如禁用/启用交换,购买更多的RAM,运行更少的进程,设置限制等)并未解决内核的低内存处理会吸引骆驼的​​潜在问题。同时,我建议在系统死机时手动运行OOM杀手(SysRq-F),因为这将使它恢复得更快。
Tronic
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.