我不想让我的计算机将数据交换到磁盘。我没有交换分区:
$ 免费 已使用的、可用的、缓存的共享缓冲区总数 内存:3841912 3670012 171900 0 74980 699652 -/+ 缓冲区/缓存:2895380 946532 交换:0 0 0
以前(可能最近是内核 2.4?)这曾经有效。内存消耗大的进程会被 oom killer 杀死,然后我会重新启动它们。但现在(Linux 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:24 UTC 2011 x86_64)google-chrome(13.0.782.24 beta)经常让我的机器进入交换的死循环。或者至少感觉像交换:X windows 需要很长时间才能更新,磁盘驱动器嗡嗡作响,gnome 面板内存图表达到上限,我在系统日志中看到此消息:
rtkit-daemon[1771]: Canary 线程似乎处于饥饿状态。请采取措施。 rtkit-daemon[1771]:降级已知实时线程。 ...
但是,根据 syslog,内核没有运行 oom killer。为了保险起见,我将 swappiness 设置为 0:
$ cat /proc/sys/vm/swappiness 0
当这种情况开始发生时,我的解决方法是使用 ctrl-alt-sysrq-f。在这种情况下,有人有配置 Linux 以自行运行 oom_kill 的方法吗?
答案1
OOM 并不一定会终止您认为会终止的进程。请在此处阅读相关内容: http://lwn.net/Articles/317814/
我怀疑正在发生的事情是由于 chrome 对每个页面使用不同的进程,这混淆了 OOM-killer 的启发式方法并且其他进程而不是父 chrome 进程被杀死。
根据这,OOM-killer 喜欢终止经过 nice 处理的进程。因此,请尝试将 chrome 的 nice 值设置为大于 0.. 可能会让它更受攻击 :-)
答案2
我得出的结论是,现代 Linux 不喜欢在没有虚拟内存的情况下运行。在硬盘速度慢/虚拟机算法较旧/等等的时代,也许摆脱交换是有意义的。或者也许你可以跳过一些环节来配置 oom killer...
但过去几个月我一直在使用交换文件,我对机器的低内存行为非常满意。它在极限时会稍微变慢,但很容易干预并终止占用大量内存的进程,让一切回到正轨。