发现一个能有效避免内存不足导致的卡死的软件:earlyoom
Tofloor
poster avatar
duanyao
deepin
2017-06-29 05:58
Author
本帖最后由 duanyao 于 2019-7-30 19:45 编辑

网站: https://github.com/rfjakob/earlyoom

文档的解说已经很详细了,不过因为是英文,我简单介绍一下:
Linux 内核中的 oom-killer 严重不靠谱,往往触发得太迟。在它工作之前,系统往往已经没救了,或者用户已经被卡得失去耐心,按了重启键。
earlyoom 是个用户态服务,顾名思义它会较早的触发(默认条件是可用物理内存和交换分区都不足10%),杀掉内存消耗最多的进程,避免系统卡死。

我试了一下还是挺有效的,用 android-studio 编译一个大工程时,它先后杀掉了 chrome、 firefox、vs code,编译得以顺利完成。

建议 deepin 预装这个软件,我相信它能避免相当数量的卡死问题。

注:2017.9  deepin 已经收录了此软件,但没有预装,大家可以用 sudo apt install earlyoom 安装试用。安装后不必做什么,下次重启系统后自动生效。
注2:2019.7 deepin 15.9.2 - 15.11 稳定版仓库里没有此软件(预计v 20恢复),你可以装 debian 仓库里的: http://ftp.cn.debian.org/debian/pool/main/e/earlyoom/earlyoom_1.2-1_amd64.deb

补充:想了一下,还是把我这些年调查内存不足导致卡死的问题是做的笔记发上来。很凌乱,没什么条理,不过里面的很多链接应该是有参考价值的。
发上来的主要目的是说明:我并非是偶尔看到一个软件就兴冲冲的推荐了,这后面是有大量铺垫的。linux_memory_swap_thrashing.zip

linux_memory_swap_thrashing.zip


再补充:还没有经历过内存不足卡死,或者喜欢作死的小伙伴,可以试试这个小程序:

http://launchpadlibrarian.net/23372552/memory_overcommit.cc

来源是 ubuntu 的一个 bug 报告 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/159356
下载后用 c++ 编译,运行。你需要输入每次分配的内存大小,单位 M,直接回车表示与上次相同。
如果剩余物理内存很多可以500M每步,剩余500M左右时改为100M每步,剩余100M左右时改为30M每步,而且不要太快。这很重要,如果最后阶段步子太大、太快,很容易被OOM killer 迅速杀掉。
剩余物理内存用系统监视器或free看就行。

在我的机器(机械硬盘)上,如果关闭 earlyoom (systemctl stop earlyoom),它几乎 100% 能卡死。之前我用的测试方法(浏览器开很多页面、开虚拟机、android-studio)太繁琐了,还是这个好。

为了从卡死中恢复,可以这么做:在运行 memory_overcommit.cc 之前,先修改 /etc/sysctl.d/99-sysctl.conf (也可能是同一目录下的其它名字),把 kernel.sysrq=0 (或其它值)改为 kernel.sysrq=1 ;然后重启系统,或执行 sudo sysctl kernel.sysrq=1 立即生效。

在卡死后,按下组合键 alt + sysrq + r  然后按 alt + sysrq + f ,这是为了手工执行 oom killer。oom killer 可能要延迟几秒钟才执行,所以不要急不可耐的反复按 alt + sysrq + f ,以免杀掉很多无辜进程。sysrq 就是 print screen 键。

Reply Favorite View the author
All Replies
3 / 5
To page
justforlxz
deepin developers team
2017-06-30 21:27
#41
https://bbs.deepin.org/post/141744
我也是ssd好不,而且内存关ssd啥事,该炸还是炸 ,clion日常1-2g,chrome日常好几g ...

既然你要跑java,就别嫌弃内存了,加钱吧。
Reply View the author
Comments
duanyao
2017-07-01 05:22
试试 46 楼的程序吧
q1377195627
deepin
2017-07-01 04:30
#42
本帖最后由 q1377195627 于 2017-6-30 20:56 编辑
https://bbs.deepin.org/post/141744
既然你要跑java,就别嫌弃内存了,加钱吧。

然而我绝大多数内存是chrome吃的
Reply View the author
duanyao
deepin
2017-07-01 05:20
#43
本帖最后由 duanyao 于 2017-6-30 21:30 编辑

还没有经历过内存不足卡死,或者喜欢作死的小伙伴,可以试试这个小程序:

http://launchpadlibrarian.net/23372552/memory_overcommit.cc

来源是 ubuntu 的一个 bug 报告 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/159356
下载后用 c++ 编译,运行。你需要输入每次分配的内存大小,单位 M,直接回车表示与上次相同。
如果剩余物理内存很多可以500M每步,剩余500M左右时改为100M每步,剩余100M左右时改为30M每步,而且不要太快。这很重要,如果最后阶段步子太大、太快,很容易被OOM killer 迅速杀掉。
剩余物理内存用系统监视器或free看就行。

在我的机器(机械硬盘)上,如果关闭 earlyoom (systemctl stop earlyoom),它几乎 100% 能卡死。之前我用的方法(浏览器开很多页面、开虚拟机、android-studio)太繁琐了,还是这个好。

为了从卡死中恢复,可以这么做:在运行 memory_overcommit.cc 之前,先执行
sudo sysctl kernel.sysrq=1
在卡死后,按下组合键 alt + sysrq + r  然后按 alt + sysrq + f ,这是为了手工执行 oom killer。oom killer 可能要延迟几秒钟才执行,所以不要急不可耐的反复按 alt + sysrq + f ,以免杀掉很多无辜进程。sysrq 就是 print screen 键。
Reply View the author
wc******[email protected]
deepin
2017-07-01 20:05
#44
谢了,先收藏
Reply View the author
herdde
deepin
2017-07-13 03:20
#45
"用 android-studio 编译一个大工程时,它先后杀掉了 chrome、 firefox、vs code,编译得以顺利完成。",它怎么知道哪个软件是自己需要的,哪些可以杀掉?
Reply View the author
duanyao
deepin
2017-07-13 03:29
#46
https://bbs.deepin.org/post/141744
"用 android-studio 编译一个大工程时,它先后杀掉了 chrome、 firefox、vs code,编译得以顺利完成。",它 ...

earlyoom 与 linux 内核的 OOM killer 选择进程的算法差不多。一个因素是内存占用,内存多的进程优先被杀掉;另一个因素是进程的 oom_adj 属性值,越大越容易被杀掉,oom_adj 可以由进程自己或系统来设置。

Chrome 把自己的渲染进程的 oom_adj  设置的很高,所以一般是第一个被杀掉的。因此你可以把 Chrome 当做报警器。
Reply View the author
zhaozhendong
deepin
2017-07-18 01:19
#47
https://bbs.deepin.org/post/141744
我觉得还是加钱升内存才是解决之道。自从加了2G内存,6G情况下就没卡过。

16G内存,i5处理器,只开2个chrome,一个gedit,半个小时内卡死2次,强制 电源关机2次的路过
Reply View the author
justforlxz
deepin developers team
2017-07-18 01:27
#48
https://bbs.deepin.org/post/141744
16G内存,i5处理器,只开2个chrome,一个gedit,半个小时内卡死2次,强制 电源关机2次的路过 ...

i3处理器,6G内存,跑chrome 5个常驻页面,后台一个wine qq,一个qtcreator,一个topbar没卡死的路过~
Reply View the author
duanyao
deepin
2017-07-18 01:35
#49
本帖最后由 duanyao 于 2017-7-17 17:36 编辑
https://bbs.deepin.org/post/141744
16G内存,i5处理器,只开2个chrome,一个gedit,半个小时内卡死2次,强制 电源关机2次的路过 ...

2个chrome 是指开了2个网页?那一般不应该占用很多内存啊,你可以用系统监视器看看。如果不是内存占用的问题,就要考虑是不是 xorg 崩溃了,通常是显卡驱动的问题。
不过 xorg 崩溃的现象一般是突然退出到登录界面,而不是长时间卡死。
Reply View the author
zhaozhendong
deepin
2017-07-18 01:39
#50
https://bbs.deepin.org/post/141744
i3处理器,6G内存,跑chrome 5个常驻页面,后台一个wine qq,一个qtcreator,一个topbar没卡死的路过~ ...

只是偶尔卡,不是很影响,

还能用,能处理好最好,处理不了,也能用,用了1周,也就卡死过3次,还能接受。
Reply View the author
zhaozhendong
deepin
2017-07-18 01:39
#51
https://bbs.deepin.org/post/141744
2个chrome 是指开了2个网页?那一般不应该占用很多内存啊,你可以用系统监视器看看。如果不是内存占用的问 ...

2个网页,


只是偶尔卡,不是很影响,

还能用,能处理好最好,处理不了,也能用,用了1周,也就卡死过3次,还能接受。
Reply View the author
duanyao
deepin
2017-07-18 02:10
#52

1周3次已经很高了,我觉得1年3次还凑合。
你可以装上 earlyoom ,如果以后任然卡死,重启后用 sudo deepin-feedback-cli 收集一下日志,发到论坛里。
Reply View the author
bsidb
deepin
2017-07-18 04:22
#53
https://bbs.deepin.org/post/141744
为了减少数据丢失的问题,可以暂时借鉴 Windows 的内存不足提示。比如在可用内存 12%-15%触发提示框, ...

对,Windows这个方案算是比较好的了。在系统自身不卡死的情况下提醒用户,交给用户处理。
Reply View the author
bsidb
deepin
2017-07-18 04:29
#54
https://bbs.deepin.org/post/141744
earlyoom 与 linux 内核的 OOM killer 选择进程的算法差不多。一个因素是内存占用,内存多的进程优先被杀 ...

不过Chrome这样做也有缺陷:有的工作环境是基于Web的,网页突然崩溃会导致编辑的文字或表格丢失,也很烦人。
Reply View the author
duanyao
deepin
2017-07-18 07:06
#55
https://bbs.deepin.org/post/141744
不过Chrome这样做也有缺陷:有的工作环境是基于Web的,网页突然崩溃会导致编辑的文字或表格丢失,也很烦 ...

这就要靠 Web 应用实现自动保存了。
Reply View the author
zhaozhendong
deepin
2017-07-18 16:49
#56
https://bbs.deepin.org/post/141744
1周3次已经很高了,我觉得1年3次还凑合。
你可以装上 earlyoom ,如果以后任然卡死,重启后用 sudo deepi ...

好,多谢
Reply View the author
Ssxfc
deepin
2017-10-13 18:55
#57
请问 运行之后要一直开着终端吗
Reply View the author
jingle
deepin
2017-10-13 19:41
#58
https://bbs.deepin.org/post/141744
请问 运行之后要一直开着终端吗

不用
Reply View the author
kppom
deepin
2017-10-18 21:18
#59
我平时专门用于跑重载CPU计算的虚拟机,CPU100%,Memory只剩60M的情况下仍然跑的很欢。我没有明细那的观察到杀后台的征兆,同时Chrome也是可以运行的,就是会卡(没CPU了)
Reply View the author
kppom
deepin
2017-10-18 21:20
#60
https://bbs.deepin.org/post/141744
楼主有心了,谢谢

主要的问题在于深度桌面的目标用户是普通用户,在普通用户没有知晓的情况下突然杀死一个 ...

推荐一个更简单的新命令,如果你知道进程的具体名称的话,可以直接用pkill threadname来干掉进程。
需要root或者sudo。
Reply View the author
3 / 5
To page