linux系统怎么防止内存耗尽卡死

这里大神多, 想请教一个关于linux系统使用的问题.

就刚刚, 我在archlinux系统做了一个非常耗内存的操作, 结果把系统内存耗尽然后卡死了. 鼠标键盘什么都操作不了, ctrl+alt+f2之类的也没反应, 风扇在那一直转. 本来想着等等可能就好了, 我等了足足有半个小时, 还是卡死在那里. 没办法, 只好强制关机, 重启, 还好刚才没有特别重要的工作要保存.

那么问题来了, 亲爱的小伙伴, 在linux上, 怎么防止某个进程耗尽内存资源, 导致整个系统卡死呢?

我也遇到这个问题了,最近在一台老电脑上玩。并不一定死机,但死机的时候一定有 mpv 播放器。

不太确定是 mpv 还是系统的问题。

ulimit? 不过我觉得更有操作性的应该是把系统VM化,限制VM的资源。

cgroups

cgroups有简单易用的现成工具吗?

你没做 swap。

2 个赞

内存8G, swap做了2G

https://raymii.org/s/articles/Limit_specific_process_memory_on_desktop_linux_with_cgroups.html#toc_1

looks up-to-date and promising. 有空再研究。

同偶尔卡死,但只要不用图形界面卡死概率还是很低的。昨天要给班里不会用电脑的小可爱写个座位表app,被迫用回flutter,4G内存一路上卡死三四次 :rofl: 看来是时候增大swapfile了 :hear_no_evil:

可能是swap也用完的缘故。可以试试看 Dynamic swap 。

1 个赞

cgroup 支持限制 CPU 内存,不过需要 Linux 内核开启了相关支持。简单场景也可以使用 ulimit,如下:

ulimit -Sv 1024000
ulimit -Sm 100000
./wild-app

ulimit限制不了rss的, 限制vm的话又没啥意义.

用 early oom daemon, 可以在内存用尽前提前杀掉占用内存太多的 process

1 个赞

开启magic sysrq之后,如果系统失去响应,可以按 alt+prtsc+f 来触发 oom 杀掉那个进程,恢复响应。

https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html

1 个赞

还是要具体问题具体分析,实际上有很多跑飞的 IO 密集型程序是 VSS 高而 RSS 占用并不高,只要是无法被操作系统在 OOM 时立即自动释放的内存占用就应该限制在内,其中就包括大量的 VSS 内存部分。单纯只是 RSS 爆涨这类程序实际上是很少见的,属于简单的内存泄露,很容易就被开发测试人员发现并修复了,这种可以用 CGROUP 来进行限制。

可以换个思路,各项工作软件设置自动保存或者手动及时保存,这样就算系统崩了也没事。

那就再提高一点 swap 容量,像你这样 2G swap 会用完的话就 8G swap。(swap 必须是 SSD)

另外 8G 物理内存偏小,建议开启 zram。

Linux 下 Firefox 内存占用就差不多 4G 了,所以我现在换 Chrome 了。

我在很长时间里也经常遇到鼠标卡得动都动不了,设置充分的 swap 就再也没遇过这种情况了,即使卡了也可以很顺畅走完 ps kill 流程。

overcommit了, vss用再多也不会触发oom啊.

zram和swap的区别是什么?

zram 可以理解为存放在内存中的 swap,使用 zram 的好处是交换进 swap 的内存数据可以压缩。