有时我会处理大量的数据转储,我想保留在内存中进行处理。有时我错误地计算了我的程序将产生的内存量,或者调试器将内存使用量乘以超出我的可用内存的系数。
每当我启动一个内存饥渴的进程时,这就是我对一个健全的操作系统的期望:尝试吃掉所有可用内存,然后很好地要求其他一些非必要进程放弃一些他们不需要的内存,然后写交换。
这就是 Ubuntu 为我所做的:吃掉所有 fre 内存,然后让操作系统交换所有基本服务(gnome 会话、终端、键盘),然后冻结并等待我拔掉电源插头。
两个问题:
我仍然没有解决该问题的方法,但我可以提供其他人可能感兴趣的两种解决方法:
1)早教
这是一个服务,它监视内存使用情况并在达到某个阈值时杀死消耗最多内存的进程(另请参阅有关 linux 内核中的 OOM 杀手的这个和这个问题)
我已经用一个演示过程对其进行了测试,该过程不确定地以小块形式请求内存。这是我的第一印象:当我启动流氓进程时,它很快就吃光了我所有的 RAM。然后交换开始,系统变得无响应。几秒钟后,系统重新上线。Earlyoom 的日志显示它在内存和交换使用率都达到 90% 后杀死了内存消耗过程。
交换开始时仍然存在令人讨厌的延迟,并且在进程被终止后,其他进程的某些部分通常会保留在交换中,直到被请求为止,但这是一个开始。
2)只是禁用交换
我知道这是一个有争议的话题,但对于桌面系统,尤其是开发机器而言,它可能会不时发生进程试图吃掉你所有的内存,这是有道理的:没有交换,OOM 杀手就可以工作如预期。当内存不足时,它会找到最好的进程来杀死并摆脱它。没有延迟,没有延迟。
您可以使用 禁用当前会话的交换sudo swapoff -a或使更改永久化。
这个问题的正确解决方案当然是当主内存耗尽时系统保持响应,并且它开始像没有明天一样交换内存,但这似乎不会很快发生。
尝试以下两件事之一:
1) 将 swappiness 设置从默认设置 60 更改为 10,即:将vm.swappiness = 10添加到 /etc/sysctl.conf(在终端中输入sudo gedit /etc/sysctl.conf),然后重新启动系统。在此处搜索 swappiness 以获取有关它的更多信息。
2) 如果交换没有帮助...即使您可能不想...将交换文件的大小增加到 1.5x16G 并看看是否有帮助。
请随时通知我。干杯,艾尔