[App Sharing] 给 Deepin 装上 macOS 同款"内存耗尽"对话框
Tofloor
poster avatar
st0nie
deepin
19 hours ago
Author

Linux 桌面用户应该都遇到过:内存吃满之后系统不会立刻死,而是先卡上几分钟,鼠标键盘全部失灵,最后只能长按电源。内核不是不
管,是它管得太晚——OOM Killer 要等到内存分配彻底失败才动手,动手之前你已经卡死了。而且它杀谁全看打分,你写到一半的文档可
能正好就是分数最高的那个。

macOS 在这件事上处理得好一些:内存耗尽时系统会把最占内存的几个应用先暂停住,弹个框让你自己决定恢复还是退出。
deepin-liferaft 就是把这套交互搬到了 Deepin 上。

原理不复杂。它每秒读一次内核的 PSI 压力指标(判断阈值直接抄的 Fedora 作业),发现持续高压就用 cgroup.freeze 把最可疑的三
个应用冻住。冻结的应用不再产生任何内存分配,压力马上就降下来,但进程本身完好无损。然后弹出"强制退出应用程序"对话框,要救
要杀随你。就算这时候直接关窗、注销,它退出前也会把冻住的应用全部解开。

名字是救生筏的意思(应用内显示名"内存救生圈")。内存不足这条船该沉还是会沉,它管不了,但能保证沉之前先把人捞上来。

常驻开销大概 13 MiB PSS,闲着的时候基本不干活。源码在 https://github.com/st0nie/deepin-liferaft/ ,欢迎试用。

deepin-liferaft-0.1.0.tar.gz

memory_eater.zip

安装完之后,可能需要手动启用服务,并开启内核的psi功能:

image.png

之后更新grub配置并重启电脑:

sudo update-grub && sudo reboot

image.png

确认PSI指标存在,即可开始试用了,用systemctl开启服务:

systemctl --user enable deepin-liferaft.service --now

开启后,可以用 python memory_eater.py 来测试,如果工作正常的话,会有这样的弹窗:

image.png

已经暂停的程序会以红字显示,选中后点击恢复即可让程序继续工作,直接关掉对话框也能恢复暂停的程序。你可以手动选择需要杀掉的程序,强制退出后,关闭对话框,系统就立刻恢复正常了

Reply Favorite View the author
All Replies
avatar
𰻞𰻝面
deepin
19 hours ago
#1

这个可以,感谢分享

Reply View the author
avatar
鲜衣怒马
deepin
18 hours ago
#2

这个可以,支持一下

Reply View the author
avatar
鲜衣怒马
deepin
18 hours ago
#3

思考,有没有非内核态的方法可以控制?这样配置不需要重启,打个包,装好就用

Reply View the author
avatar
st0nie
deepin
18 hours ago
#4
鲜衣怒马

思考,有没有非内核态的方法可以控制?这样配置不需要重启,打个包,装好就用

这个软件目前用了两套判断方法,一套是判断内存用量大于95%且swap用量大于95%,另一套是psi full 10 > 50%,不改内核参数也可以工作,但可能反应稍微慢一点,因为 psi full 指标能将内存满了“变卡”的程度量化出来

Reply View the author
avatar
米饭虚拟机-nana版
deepin
18 hours ago
#5

nana_wow.png

Reply View the author
avatar
鲜衣怒马
deepin
18 hours ago
#6
st0nie

这个软件目前用了两套判断方法,一套是判断内存用量大于95%且swap用量大于95%,另一套是psi full 10 > 50%,不改内核参数也可以工作,但可能反应稍微慢一点,因为 psi full 指标能将内存满了“变卡”的程度量化出来

好方法,感谢分享

Reply View the author
avatar
deepin流云
Super Moderator
Community OP
18 hours ago
#7

好东西kissing_heart @一头牛 @babyfengfjx 感觉系统是不是可以考虑从功能层面引入这样的内存管控机制?

Reply View the author
avatar
mozixun
Moderator
18 hours ago
#8
deepin流云

好东西kissing_heart @一头牛 @babyfengfjx 感觉系统是不是可以考虑从功能层面引入这样的内存管控机制?

直接参考KDE Plasma就行, KDE Plasma有做了实现

Reply View the author
avatar
st0nie
deepin
18 hours ago
#9
mozixun

直接参考KDE Plasma就行, KDE Plasma有做了实现

https://www.phoronix.com/news/KDE-Plasma-OOM-Notifications

plasma 做的是 OOM 通知,杀应用是kernel oom或者systemd-oomd来杀的,plasma 这个应该只是让你知道应用被杀了

Reply View the author
avatar
一头牛
deepin product team
17 hours ago
#10

有点东西哇
image.png

Reply View the author
avatar
babyfengfjx
Super Moderator
CQA
17 hours ago
#11

优秀agree

Reply View the author
avatar
一粒
deepin
17 hours ago
#12

applaud

Reply View the author
avatar
庸俗的浪漫着
deepin
17 hours ago
#13

agree

优秀,mac上的这个确实挺好用的。

Reply View the author
avatar
Ligocut光剪视频剪辑软件
deepin
Backbone of ecological co-construction group
16 hours ago
#14
deepin流云

好东西kissing_heart @一头牛 @babyfengfjx 感觉系统是不是可以考虑从功能层面引入这样的内存管控机制?

引入,引,快引

Reply View the author
avatar
RucLinux
deepin
16 hours ago
#15

这个厉害,内核大佬 joy

Reply View the author
avatar
gfdgd_xi
deepin
Ecological co-builder
15 hours ago
#16

大佬好强,想问下我想内置您的程序到 GXDE 里,可以吗

Reply View the author
avatar
st0nie
deepin
12 hours ago
#17
gfdgd_xi

大佬好强,想问下我想内置您的程序到 GXDE 里,可以吗

如果你想的话,为什么不呢,欢迎fork||pr

Reply View the author
avatar
gfdgd_xi
deepin
Ecological co-builder
12 hours ago
#18
st0nie

如果你想的话,为什么不呢,欢迎fork||pr

谢谢大佬 kissing_heart

Reply View the author
avatar
鲜衣怒马
deepin
12 hours ago
#19

快内置,必须内置,25.2.2里面我必须看到!

Reply View the author