发现一个能有效避免内存不足导致的卡死的软件: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
1 / 5
To page
jingle
deepin
2017-06-29 17:14
#1
谢谢推荐,先研究下。
Reply View the author
justforlxz
deepin developers team
2017-06-29 17:27
#2
我觉得还是加钱升内存才是解决之道。自从加了2G内存,6G情况下就没卡过。
Reply View the author
jeryjian861011
deepin
2017-06-29 17:27
#3
希望能内置在系统里,这样我们这些小白就不会因为不懂怎样配置软件而头痛
Reply View the author
jingle
deepin
2017-06-29 17:37
#4
刚才讨论了 这个方案可能谁kill其他的应用 导致数据丢失,已经有大神在解决了
Reply View the author
FZFZ
deepin
2017-06-29 17:46
#5
https://bbs.deepin.org/post/141744
我觉得还是加钱升内存才是解决之道。自从加了2G内存,6G情况下就没卡过。

8G内存的我,该卡时也卡。
Reply View the author
duanyao
deepin
2017-06-29 17:54
#6
https://bbs.deepin.org/post/141744
我觉得还是加钱升内存才是解决之道。自从加了2G内存,6G情况下就没卡过。

我认为并不是(我有8G内存)。用户很多时候无法预测一个程序会使用多少内存,比如开一个网页用多少内存?这要看网页的复杂程度和浏览器的实现,以及一些偶然因素。还有就是软件的内存泄漏,这是多少内存也救不了的。 操作系统绝对不应该因为普通应用程序的问题而卡死。
Reply View the author
HualetWang
deepin
2017-06-29 17:55
#7
小内存就不要考虑使用chrome了,另外,也可以试试  https://github.com/Nefelim4ag/systemd-swap
Reply View the author
duanyao
deepin
2017-06-29 18:05
#8
https://bbs.deepin.org/post/141744
刚才讨论了 这个方案可能谁kill其他的应用 导致数据丢失,已经有大神在解决了 ...

不知道你们的解决思路是什么,能否透露一二?

我觉得在现阶段,linux 桌面在内存耗尽的时候丢失数据是无法完全避免的,问题只在于丢失的多少。
要么是一两个耗内存的应用被杀死而丢数据,要么是整个系统硬重启而丢数据,前者总还是好一些。

我觉得目前最优雅的解决方案,还是 android 的 low memory killer (当然 iOS 也类似),在内存接近耗尽时,先通知所有应用,让它们保存状态,等一段时间后再杀死非前台的应用。然而 linux 桌面似乎还没有类似的通知机制(也可能我不知道,但显然没有广泛采用),所以 earlyoom 似乎是现阶段相对靠谱的方案了。希望未来能引入类似 android 的机制。
Reply View the author
duanyao
deepin
2017-06-29 18:11
#9
https://bbs.deepin.org/post/141744
小内存就不要考虑使用chrome了,另外,也可以试试  https://github.com/Nefelim4ag/systemd-swap ...

我的内存并不小(8G),另外我开那么多耗内存的程序当然是为了测试。
另外重点并不是“小于xG内存就不要用y软件”了,因为软件太多了,光是基于 blink/webkit 内核的程序就一大堆(vs code,electron等),重点是任何情况下,操作系统不应该被普通应用搞死。
Reply View the author
wtz
deepin
2017-06-29 18:17
#10
http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=476652
Reply View the author
duanyao
deepin
2017-06-29 18:34
#11

这个帖子很老了,讨论的问题和解决方案并不超出我的认知范围。我关注这个问题也有好几年了,查阅了很多资料,自己也做了一些测试,确认不论打开或关闭 swap 分区、调整 swap 参数等都是无效的,最近又确认 OOM killer 是经常无效的,earlyoom 看来是比较有希望的。

这两个问答希望感兴趣的人读一读(其实 earlyoom 的文档也引用了它们):

https://unix.stackexchange.com/q ... -on-forced-swapping

https://superuser.com/questions/ ... vent-earlier/708430
Reply View the author
HualetWang
deepin
2017-06-29 18:49
#12
https://bbs.deepin.org/post/141744
胡说,昨晚我还在用1g内存的上网本用chrome逛淘宝~~完全没事。
只不过,我用的是xfce4,d ...

你装个chrome不用还更没事呢
Reply View the author
HualetWang
deepin
2017-06-29 18:50
#13
https://bbs.deepin.org/post/141744
我的内存并不小(8G),另外我开那么多耗内存的程序当然是为了测试。
另外重点并不是“小于xG内存就不要 ...

这句话没毛病
Reply View the author
HualetWang
deepin
2017-06-29 18:50
#14
https://bbs.deepin.org/post/141744
我的内存并不小(8G),另外我开那么多耗内存的程序当然是为了测试。
另外重点并不是“小于xG内存就不要 ...

这句话没毛病
Reply View the author
duanyao
deepin
2017-06-29 19:10
#15
本帖最后由 duanyao 于 2017-6-29 11:11 编辑

补充:想了一下,还是把我这些年调查内存不足导致卡死的问题是做的笔记发上来(见一楼的附件)。很凌乱,没什么条理,不过里面的很多链接应该是有参考价值的。
发上来的主要目的是说明:我并非是偶尔看到一个软件就兴冲冲的推荐了,这后面是有大量铺垫的。
Reply View the author
134******40
deepin
2017-06-29 19:19
#16
duanyao 发表于 2017-6-29 11:10
补充:想了一下,还是把我这些年调查内存不足导致卡死的问题是做的笔记发上来(见一楼的附件)。很凌乱,没 ...

这个确实可以单独发帖,支持。
Reply View the author
raphaelzhang
deepin
2017-06-29 19:32
#17
楼主有心了,谢谢

主要的问题在于深度桌面的目标用户是普通用户,在普通用户没有知晓的情况下突然杀死一个进程实际上是蛮惊悚的,在系统设计上不好。

对于熟悉Linux的人来说,在桌面遇到了响应慢的问题,比较常见的方法是tty -> top -> kill,这个很快的。

对于普通用户来说,比较好的方式是通过任务管理器杀进程。

对于内核的oom-killer来说,其实它主要的用途是长期无人值守运行的机器上杀进程,因为没有交互,所以等待时间略长也没啥。当然,这对于桌面这种人机交互多的来说确实不好,在这个意义上,earlyoom是有用的,但是就像之前说的那样,普通用户应该用任务管理器,高手会tty->top->kill,所以有点鸡肋。最主要的是,用户应该有决定权,而不是无法控制哪个程序被杀。
Reply View the author
duanyao
deepin
2017-06-29 19:35
#18
https://bbs.deepin.org/post/141744
这个确实可以单独发帖,支持。

谢谢支持,不过单独发帖的话,还是等我整理整理吧,让大家能看明白。
Reply View the author
duanyao
deepin
2017-06-29 19:49
#19
https://bbs.deepin.org/post/141744
楼主有心了,谢谢

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

没这么简单,真的。有时候响应慢会达到 tty 登录都要好几分钟,甚至登录失败的程度,打字的延迟可能要好几秒,top/kill 不可能进行,这都是亲身经历。你还可以看看13楼的链接,遇到这个问题的不在少数,很多都是有经验的用户。

oom-killer 对服务器来说很多情况下也是不合适的,因为很多服务的延迟是很重要的(比如web服务器)。与其让服务器卡住几十分钟,还不如尽快杀死服务再重启(systemd 等可以自动重启崩溃的服务)。

至于缺少用户交互的问题,我觉的可以借鉴 Windows 的“内存不足”提示框。earlyoom 默认在可用内存 10% 时触发,那么 deepin 的“内存不足”提示框可以在 12%-15% 触发,让用户有机会保存数据。当然最根本的解决之道还是学习 android、iOS,让系统通知应用自动保存状态,然后再杀掉应用。
Reply View the author
raphaelzhang
deepin
2017-06-29 19:58
#20
https://bbs.deepin.org/post/141744
没这么简单,真的。有时候响应慢会达到 tty 登录都要好几分钟,甚至登录失败的程度,打字的延迟可能要好 ...

tty -> top -> kill还好吧,我自己遇到系统延迟时都可以解决,有时候确实有点慢,但几分钟还没有遇到过。

是的,oom-killer在服务器上缺省配置也不一定好,很多时候会造成延迟或者误杀,这个时候其实要做的是调整重要进程的oom值,panic_on_oom值,还有就是增加服务器的资源或者减少进程的预分配资源。

主要是不经用户同意就杀进程不好。
Reply View the author
Comments
duanyao
2017-07-01 05:23
试试 46 楼的程序吧
1 / 5
To page