今天我(不小心)在我的 Linux 机器上运行了一些快速使用大量内存的程序。我的系统死机,反应迟钝,因此我无法杀死罪犯。
我怎样才能在未来防止这种情况?它不能至少保持一个响应式核心或其他东西运行吗?
wom*_*ble 16
我敢打赌,系统实际上并没有“冻结”(在内核挂起的意义上),而是非常没有响应。可能只是交换非常困难,导致交互性能和系统吞吐量像石头一样下降。
您可以关闭交换,但这只会将问题从性能低下改为 OOM 终止进程(以及由此产生的所有乐趣),同时由于可用磁盘缓存较少而导致性能下降。
或者,您可以使用每个进程的资源限制(通常称为rlimit
和/或ulimit
)来消除单个进程占用大量内存并导致交换的可能性,但这只会让您进入娱乐领域,进程在不方便的时刻,因为他们想要比系统愿意给他们更多的内存。
如果你知道你要做一些可能会导致大量内存使用的事情,你可能会写一个包装程序,mlockall()
然后执行你的 shell;这会将它保存在内存中,并且将是您可能获得的最接近“保持响应式内核”的方法(因为问题并不是 CPU 被过度使用)。
就我个人而言,我赞成“不要做蠢事”的资源控制方法。如果你有 root,你可以对系统造成各种损害,所以做任何你不知道可能结果的事情都是有风险的。
你可以使用一个像earlyoom这样的守护进程来检查Swap和可用的RAM,你可以配置你想要有多少内存可用,RAM和SWAP,然后如果这个阈值发生,它会杀死最大的内存吞噬者,通常是有罪的吞噬者,如果您愿意,您还可以有一个例外列表。
这是自 2007 年以来已知的错误 - 请参阅高内存使用率时系统冻结。
在这种情况下,Windows 会显示一个对话框,警告用户关闭一个或多个应用程序。
这是特别难以预防的事情。这是因为内核开始交换。一种解决方案是关闭交换。当系统内存不足时,内核不会开始交换,而是会杀死一些进程;通常它会选择正确的进程来杀死,但无论如何,杀死随机进程比让系统无响应要好。
对于服务器来说,这可能是一个特别好的解决方案,因为服务器通常有足够的 RAM,当它们开始使用交换空间时,无论如何都意味着出现了问题。然而,台式机通常需要交换空间,所以我认为对于台式机没有好的解决方案。我经常关闭服务器中的交换空间,特别是当怀疑存在内存泄漏时。
归档时间: |
|
查看次数: |
22798 次 |
最近记录: |