如果一个进程需要大量内存,系统会将所有其他进程移动到交换文件中。似乎包括必要的进程,如 X11 服务器或终端。
因此,如果一个进程继续无限制地分配,一切都会变得无响应,直到该进程被 OOM 杀手杀死。我的笔记本电脑似乎特别灵敏,反应非常糟糕。我只是花了整整一个小时等待进程终止,在此期间甚至无法移动鼠标光标。
如何避免这种情况?
1)禁用交换=>我经常启动很多然后变得不活动的进程。不活动的应该移到交换区。
2) 买个 SSD => 太贵了
3) 设置最大内存 ulimit => 但如果程序需要合理的大量内存,它就会失败。问题不是它使用太多,而是它抑制了其他进程
4) 将重要的程序(X11、bash、kill、top 等)保存在内存中并且永远不要交换那些 => 可以这样做吗?如何?也许只交换大程序?
5) ?
做了一些研究,我发现可以通过在 /proc/pid/oom_adj 中插入一个值来调整甚至使某些进程对 OOM 杀手免疫,我当然需要使用 pidof 或 pgrep 为我的进程找到 pid 或类似的东西,并制作一个脚本,一旦我的所有进程都启动并运行,我就会运行该脚本。
OOM 杀手的问题就像任何其他杀手一样。表面上看起来很理智很理性,但其实内心很不安,很疯狂,常常无法做出正确的判断。
现在我个人不介意杀戮,只要我知道发生了什么并且对受害者有一定的控制权(冷静的人,我在谈论计算机的东西)所以我正在寻找更好的方法来保护针对可怕的 OOM 杀手的某些进程,这样我就不必在每次我的所有程序运行时或每当我启动一个新程序时都运行脚本。关于如何轻松实现这一目标的任何想法?