发新帖

发现一个能有效避免内存不足导致的卡死的软件:earlyoom

duanyao / 2017-6-28 21:58
浏览: 3143 / 回复: 70
楼主: duanyao

发现一个能有效避免内存不足导致的卡死的软件:earlyoom

  [复制链接]

0

主题

19

帖子

304

积分

-r--r-----

Rank: 2

积分
304
raphaelzhang 发表于 2017-6-29 11:58:15 | 显示全部楼层
duanyao 发表于 2017-6-29 11:49
没这么简单,真的。有时候响应慢会达到 tty 登录都要好几分钟,甚至登录失败的程度,打字的延迟可能要好 ...

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

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

主要是不经用户同意就杀进程不好。

点评

试试 46 楼的程序吧  发表于 2017-6-30 21:23

0

主题

19

帖子

304

积分

-r--r-----

Rank: 2

积分
304
raphaelzhang 发表于 2017-6-29 11:59:15 | 显示全部楼层
本帖最后由 raphaelzhang 于 2017-6-29 12:00 编辑

不过我觉得earlyoom作为一个可选项倒是可以装的,但是不要缺省装,不然用户估计又要抱怨了

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 12:02:39 | 显示全部楼层
jingle 发表于 2017-6-29 09:37
刚才讨论了 这个方案可能谁kill其他的应用 导致数据丢失,已经有大神在解决了 ...

7dd98d1001e939013602dab778ec54e736d19632.jpg

为了减少数据丢失的问题,可以暂时借鉴 Windows 的内存不足提示。比如在可用内存 12%-15%触发提示框,而 earlyoom 在 10% 触发,作为最后的安全网。
长期来看,还是应该借鉴 android 的 low memory killer,让用户能“无忧操作”。

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 12:09:21 | 显示全部楼层
raphaelzhang 发表于 2017-6-29 11:58
tty -> top -> kill还好吧,我自己遇到系统延迟时都可以解决,有时候确实有点慢,但几分钟还没有遇到过。 ...

不知道你的电脑配置如何,这更容易发生在机械硬盘,并运行内存和IO都密集的应用时(例如android-studio、虚拟机)。这个问题说常见吧也不是非常常见,也有很多用户从来没遇到过。

21

主题

694

帖子

3931

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3931
debuggerx 发表于 2017-6-29 12:10:06 | 显示全部楼层
公司开发机原本8g内存,只开as开发安卓+几十个chrome页面也没问题;
后来连着把后台代码也写了,同时开as和idea,chrome再开几个页面就会卡死;
于是申请加内存,加到了12g,终于又开心地玩耍了一阵;
然而好景不长,后面又开始做其他东西,必须同时开着虚拟机和ide,又开始时不时卡死了……
像这种情况下,确实是只有堆内存才能解决了,软件是无能为力的,,以后真的是得16g起步了。。

2

主题

181

帖子

1089

积分

-rw-r--r--

Rank: 4

积分
1089
rdlg 发表于 2017-6-29 12:10:14 | 显示全部楼层
可能因为Linux长期是作为服务器存在的 感觉这个问题一直没被重视
我之前也调查过这个问题 但是没来得及验证各种猜想
1. 如果确定是持续页面交换导致的 那么减小甚至关闭swap分区是否会有帮助
2. cgroup提供的rss限制是否能够有效遏制这个问题
3. 磁盘读写优先级能否保证某些程序优先相应
4. 是否有类似非换页内存的概念,保证系统关键进程不被换出
从之前使用Windows的经验来看,系统很少因为内存不够出现系统卡死的状况,可能和Windows的图形组件在内核中有关,也可能是因为关键组件存在保护机制。
但是如果是磁盘IO量大,Windows也会卡的不能动,这种情况在Win10之后似乎有所改进,我曾经试过在这种情况下,其他应用都卡的不能动,但是系统的任务管理器在调出来后能够流畅运行。

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 12:11:41 | 显示全部楼层
raphaelzhang 发表于 2017-6-29 11:59
不过我觉得earlyoom作为一个可选项倒是可以装的,但是不要缺省装,不然用户估计又要抱怨了 ...

我觉得可以,先放到源里,让遇到过这个问题的用户试试。

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 12:28:03 | 显示全部楼层
本帖最后由 duanyao 于 2017-6-29 12:38 编辑
rdlg 发表于 2017-6-29 12:10
可能因为Linux长期是作为服务器存在的 感觉这个问题一直没被重视
我之前也调查过这个问题 但是没来得及验证 ...

你可以看看一楼的附件,不过有点太乱,我简单回答一下:

1. 如果确定是持续页面交换导致的 那么减小甚至关闭swap分区是否会有帮助

几乎没有。交换至少有两种,一种是 swap 分区/文件上的交换,一种是 pagecache 的淘汰/填充,后一种的确被很多 linuxer 忽略了。关闭swap分区并不能避免pagecache交换导致的卡死。不过考虑到现在内存和机械硬盘的速度差距是如此之大,关闭 swap 应该有利于保持系统的响应速度(我没有具体的数据),我现在就是关闭的。SSD 就速度来说适合做 swap,但考虑到寿命嘛,就见仁见智了。

2. cgroup提供的rss限制是否能够有效遏制这个问题

有这样的建议,原理上可行,但桌面上还没有开箱即用的方案。

3. 磁盘读写优先级能否保证某些程序优先相应

linux 的磁盘调度器长期没啥大改进了,一直推荐cfq,但它显然不能解决机械硬盘上的卡死问题。最近新的 bfq 进了 4.12 内核,有望改善机械硬盘的调度,但还需要一段时间才能被各发行版采用。我们到时候再看。

4. 是否有类似非换页内存的概念,保证系统关键进程不被换出

有的,mlock 系列系统调用。 earlyoom 就用了,保证自己不被换出。

从之前使用Windows的经验来看,系统很少因为内存不够出现系统卡死的状况

windows 不支持 overcommit,linux 则支持。这样 windows 分配内存比较保守,相对不容易出现此问题(但也会出问题,我也遇到过,任务管理器也出不来,只好重启)。但 linux 不适合关闭 overcommit(尽管是可以的),因为大量的 linux 程序是按照可以 overcommit 的假设编写的,关闭 overcommit 的结果是你必须浪费很大一部分物理内存。

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 12:46:10 | 显示全部楼层
debuggerx 发表于 2017-6-29 12:10
公司开发机原本8g内存,只开as开发安卓+几十个chrome页面也没问题;
后来连着把后台代码也写了,同时开as和 ...

如果是必须同时运行那就没办法了,不过像浏览器的话我可以接受它被杀掉,反正重新打开时会自动恢复tab。
移动浏览器遇到内存不足时会自动卸载后台tab的,切换过去时又重新加载,桌面浏览器如果借鉴一下就好了。

2

主题

651

帖子

1888

积分

-rw-rw-r--

Rank: 5Rank: 5

积分
1888
wtz 发表于 2017-6-29 13:31:01 | 显示全部楼层
duanyao 发表于 2017-6-29 10:34
这个帖子很老了,讨论的问题和解决方案并不超出我的认知范围。我关注这个问题也有好几年了,查阅了很多资 ...

明白。

其实这里我想说明的是,在处理内存不足的问题上,开发者和普通用户之间对“内存”的理解差异是造成OOM Killer不能“如期”工作的原因。
开发者眼中:“内存不足”是指进程请求分配更多内存时,(逻辑上)没有更多可供分配的内存;
普通用户眼中:“内存不足”是指(物理)内存用量超过一定限额,导致界面交互出现迟缓。
而在这当中,怎样界定“可供分配的内存”、“内存用量”和“界面交互进程与系统核心进程”,又因操作系统所处场景的不同而不同。

因此,个人认为,对于一个大众化发行版的桌面版本而言,有必要认真考虑以上问题,并根据用户反馈主动调整系统资源的管理策略。

38

主题

743

帖子

3846

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3846
liulangdedao 志愿者 发表于 2017-6-29 13:34:04 | 显示全部楼层
个人应用的问题了吧,我曾经2g的内存,需要上网的时候,只单开 一个浏览器,标签页保持在三四个,照样愉快的上网,后来加了 一个4g的内存,变成了6g内存,系统顿时流畅了许多,可是没有多久,系统竟然卡死了,后来琢磨了一下,哪一次,我的谷歌开了将近二十个标签页,开着QQ,听着网易云音乐,开着虚拟机……系统不卡死才怪,系统运行的软件,保持一个合理的数目才是王道,否则就算加到32g,你 硬要开一堆程序,照样的卡死!

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 13:46:45 | 显示全部楼层
wtz 发表于 2017-6-29 13:31
明白。

其实这里我想说明的是,在处理内存不足的问题上,开发者和普通用户之间对“内存”的理解差异是造 ...

对的。但更准确地说,是操作系统内核没有足够的知识去有效管理用户态程序的内存,很多事情还是要移到用户态来做,甚至移到桌面环境上来做。比如,通知应用保存状态,因为即将杀死应用;让窗口不在前台的应用优先被杀死,等等。

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 13:49:12 | 显示全部楼层
liulangdedao 发表于 2017-6-29 13:34
个人应用的问题了吧,我曾经2g的内存,需要上网的时候,只单开 一个浏览器,标签页保持在三四个,照样愉快 ...

希望你能有耐心爬一下楼,如果没有,对比一下别的操作系统,有比较才有鉴别。Android 和 iOS 绝不会因为“ 硬要开一堆程序”而卡死,Windows 也比较少。

15

主题

1045

帖子

3435

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3435
QQ
jdocker 发表于 2017-6-29 17:41:58 来自移动端 | 显示全部楼层
我决定装个试试,已经死过两三次了,打开虚拟机和几个开发工具就卡死,已经8g内存了

点评

可以用 46 楼的程序验证一下效果  发表于 2017-6-30 21:32

38

主题

743

帖子

3846

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3846
liulangdedao 志愿者 发表于 2017-6-29 22:03:42 | 显示全部楼层
duanyao 发表于 2017-6-29 13:49
希望你能有耐心爬一下楼,如果没有,对比一下别的操作系统,有比较才有鉴别。Android 和 iOS 绝不会因为 ...

ios没有用过不知道,但是我的安卓手机,确实是开多了软件就要卡死,用的机子比较老,红米1.如今使用的时候,很少打开超过三个程序。至于windows,开多了他会有个提示框,提示你关闭一些程序,

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-29 23:22:45 | 显示全部楼层
liulangdedao 发表于 2017-6-29 22:03
ios没有用过不知道,但是我的安卓手机,确实是开多了软件就要卡死,用的机子比较老,红米1.如今使用的时 ...

我想你的手机不会比我的差:充话费送的 TCL P331M,只有512M内存。即使这样,用了2年也从未出现卡死,而且我也几乎不用任务管理器杀掉应用。当然经常出现的情况是后台应用突然就被系统杀掉了,比如前台用着微信,后台的音乐播放器忽然就没声了。我的另一台中兴U956手机出现过卡死,但与内存不足无关,只在硬解码播放某些视频时出现,可能是底层故障。我想你需要更多分析才能确定卡死的真正原因,如果确实是开多了软件就要卡死,那么我想小米的系统存在严重缺陷。

Windows 的情况我前面也说了,比 Linux 不容易卡死,但也不能完全避免。

5

主题

215

帖子

769

积分

-r--r--r--

Rank: 3Rank: 3

积分
769
q1377195627 发表于 2017-6-30 00:14:39 | 显示全部楼层
kirigaya 发表于 2017-6-29 09:27
我觉得还是加钱升内存才是解决之道。自从加了2G内存,6G情况下就没卡过。

呵呵,我8g日常爆炸

48

主题

2069

帖子

6649

积分

drw-r--r--

Rank: 7Rank: 7Rank: 7

积分
6649
QQ
kirigaya 超级版主 发表于 2017-6-30 08:51:05 | 显示全部楼层
q1377195627 发表于 2017-6-30 00:14
呵呵,我8g日常爆炸

可能是因为我用的ssd吧,而且6G从来没用到超过4G上。

85

主题

3023

帖子

1万

积分

d-rw-rw-r--

Rank: 8Rank: 8

积分
12048
wangyong 官方管理员 发表于 2017-6-30 09:07:47 来自移动端 | 显示全部楼层
duanyao 发表于 2017-6-29 10:05
不知道你们的解决思路是什么,能否透露一二?

我觉得在现阶段,linux 桌面在内存耗尽的时候丢失数据是无 ...

andriod的解决方案是所有应用都要遵守他的sdk,系统可以随时杀死进程,所以应用会主动保存数据,把保存数据的问题踢给应用开发厂商。桌面linux应用没有统一标准,当然有一天都用深度adk就可以办到了,哈哈哈哈

16

主题

1305

帖子

3326

积分

-rw-rw-rw-

Rank: 6Rank: 6

积分
3326
duanyao 发表于 2017-6-30 10:04:37 | 显示全部楼层
wangyong 发表于 2017-6-30 09:07
andriod的解决方案是所有应用都要遵守他的sdk,系统可以随时杀死进程,所以应用会主动保存数据,把保存数 ...

深度自己无疑可以先做起来,这会成为一项杀手级特性的。然后推动它成为 freedesktop.org 的标准,那么其它的 linux 桌面应用也可以加入进来。内存不足通知从原理上说不需要依赖特定 sdk,用 domain socket、dbus 或许都是可行的;自动保存数据就由应用自己实现了,用什么技术都行,不限制。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回版块 返回顶部