Android 低内存 Killer--是去是留?

作者:Zack Brown

Linux 内核(以及所有操作系统内核)的任务之一是管理系统可用的资源。当这些资源用尽时,应该怎么做?如果资源是 RAM,那么选择不多。接管任何用户软件的行为、理解该软件的功能并使其更节省内存是不可行的。相反,内核别无选择,只能尝试识别最主要占用系统 RAM 的软件并终止该进程。

官方内核使用其 OOM(内存溢出)杀手来执行此操作。但是,像 Android 这样的 Linux 后代想要更多——他们希望执行类似的垃圾回收形式,但在系统仍然完全响应的情况下进行。他们想要一个低内存 Killer,它不会等到最后一刻才终止应用程序。不言而喻的假设是,手机应用程序不太可能运行像心脏-肺机器或核聚变反应堆这样的关键系统,因此在一个 Android 机器上运行一个进程(或多或少)实际上并不重要。

低内存 Killer 曾经存在于 Linux 源代码树中,直到最近。它被移除,部分原因是由于与现有的 OOM 代码重叠,部分原因是相同的功能可以通过用户空间进程提供。并且,Linux 内核开发的一个要素是,如果某些事情可以在用户空间中做得同样好,那么就应该在那里完成。

Sultan Alsawaf 最近打开窗户,伸出头,大喊:“我气疯了,我再也无法忍受了!”并且,他为 Android 内核重新实现了低内存 Killer。他认为用户空间版本非常糟糕,需要被抛弃。 除此之外,他说,它杀死了太多的进程,而且速度太慢。他认为迁移到用户空间守护进程的技术理由尚未明确,而内核内解决方案才是真正的出路。

在 Sultan 的实现中,算法很简单——如果内存请求失败,则进程被杀死——干净利落,毫不含糊。

对这个补丁存在统一的反对声。以至于很明显,Sultan 的主要目的不是成功提交补丁,而是点燃维护用户空间版本的人们的怒火,希望他们可能会实现他想要的一些改进。

Michal Hocko 非常清楚地表达了他对 Sultan 补丁的反对——Linux 内核不会并排坐着两个单独的 OOM Killer。适当的 OOM Killer 将尽可能好地实现,任何低内存 Killer 和其他内存微调器都必须存在于用户空间中,以用于像 Android 这样的特定项目。

Suren Baghdasaryan 也确信内核源代码树中的多个 OOM Killer 将是行不通的。他邀请 Sultan 从改进用户空间低内存 Killer 的角度来解决问题。

Sultan 的代码也存在技术问题。 Michal 认为它的范围不够广泛,实际上只适用于一个非常特定的用例。Joel Fernandes 也同意 Sultan 的方法太简单了。Joel 指出,“瞬时临时内存峰值不应成为杀死_任何_进程的信号。杀死反应不应如此自发,以至于不必要的任务因系统进入恐慌模式而被杀死。”相反,他说,需要对内存使用统计数据进行平均,以便可以对要杀死的进程做出适当的判断。因此,用户空间版本确实很慢,但这种缓慢是设计使然,以便代码可以对如何进行做出细微的判断。

但是另一方面,Suren 同意用户空间代码可以更快,并且开发人员正在研究加快其速度的方法。

通过这种方式,讨论逐渐转变为解决用户空间实现中的缺陷并寻找解决这些缺陷的方法。在某种程度上,Sultan 的代码为用户代码在未来某个时候想要达到的目标提供了一个基准。

开发人员实现整个功能,只是为了说明现有功能存在错误,这并非闻所未闻。在这种情况下,似乎确实听到了这一点。

注意:如果您在上面被提及并希望在评论区上方发布回复,请将您的回复文本发送至 ljeditor@linuxjournal.com。

Zack Brown 是 Linux JournalLinux Magazine 的技术记者,并且曾是 “Kernel Traffic” 每周新闻通讯和 “Learn Plover” 速记打字教程的作者。他于 1993 年首次在他的 386 计算机上安装了 Slackware Linux,配备了 8 兆内存,并被开源社区彻底震撼。他是 Crumble 纯策略棋盘游戏的发明者,您可以用几块纸板自己制作。他还喜欢写小说、尝试动画、改革拉班舞谱、设计和缝制自己的衣服、学习法语以及与朋友和家人共度时光。

加载 Disqus 评论