我认为这并不是一个不常见的问题:一个进程分配大量的内存(这是由于内存泄漏错误所致,因为您尝试处理不可行的大输入文件,或其他原因)。RAM已满,并且在某些时候Linux必须切换到交换。好吧,有时候这只是最后的选择:如果我要进行昂贵的计算,如果快要用完RAM了,我不想丢失数据。
但是(以我的经验)更常见的是,内存消耗不受无赖(可能是错误的)过程的限制。就是说,我不仅要交换一些不那么急需的数据,而且操作系统不得不紧急交换数据负载。不幸的是,这不仅严重破坏了令人讨厌的过程,而且可能使整个系统陷入停顿(在装有SSD的计算机上,情况已经不再那么糟糕了,但是OTOH让我担心是否要写入数千兆字节的垃圾数据)。长期损害闪存)。
直到我发现问题并手动终止进程(实际上甚至要花几分钟才能让我自己登录到虚拟终端!),我一半的运行会话仍处于交换状态,我需要等待相当长的一段时间,直到系统运行平稳再次。
解决这个问题的方法很简单:强制执行硬内存限制。但是在整个系统范围内进行操作有时会杀死我本来仍然需要的进程,如果ulimit
在启动有问题的进程之前必须手动进行操作……那么,我常常会忘记直到为时已晚。
我可能更喜欢的解决方案:
- 如果有任何进程超出了一定的内存使用量,则会人为地限制它,以便系统的其余部分保持响应。
- 如果有任何进程超出了一定的内存使用量,那么它将被
SIGSTOP
ping,因此我有时间弄清楚下一步该怎么做。 - 如果进程接近RAM限制,那么在进行大容量交换之前,我会收到警告。
有什么办法可以得到这样的行为,或者类似的?
ulimit
。