Ubuntu 26.10 重构 OOM 策略:优先牺牲应用程序,全力保住桌面会话
用 Linux 桌面的开发者常遇到内存耗尽时桌面瞬间闪退的惨剧。Ubuntu 26.10 正式调整 OOM 策略,将 GNOME Shell 等 39 个核心会话服务的评分降至 -500,并将 systemd-oomd 内存压力设为 auto,实现测试崩溃率清零。
作者:核流编辑 · 栏目:系统
用 Linux 桌面的老哥们,谁没经历过这种绝望时刻?内存刚吃满,系统没去动那个吞了几十 G 内存的虚拟机,反手就把你的桌面干崩了。未保存的代码瞬间蒸发——这个逆天逻辑终于被 Ubuntu 治了!在最新的 Ubuntu 26.10 中,开发团队通过 ubuntu-settings 26.10.1 正式推行了全新的内存终止策略:核心原则非常直接,那就是确立“优先牺牲应用程序、全力保全桌面会话”的防御机制。 荒诞的内存倒挂:杀了字符工具,却留着吃满内存的虚拟机 在传统的 Linux 内核设计中,当可用物理内存耗尽时,内核 OOM Killer 会给系统中的所有进程排队打分。评分依据由进程实际内存开销加上用户空间调节值 oom_score_adj 共同决定。其打分区间从 -1000 到 1000,数值越低代表优先级越高、越不容易被内核清除。 但此前的默认评分配置却引发了极其荒谬的倒挂。以 Ubuntu 24.10 桌面环境的数据为例:图形桌面的命脉 GNOME Shell 的评分居然是 100,这与日常吃内存大户 Firefox 及其子进程平起平坐;而系统底层的 dbus-daemon 和 systemd-oomd 评分低至 -900,systemd-journald 为 -250。 在这种机制下,曾发生过一起广为人知的翻车案例。一名开发者因为代码逻辑错误,不小心拉起了一大堆虚拟机实例,把整机内存彻底挤爆。然而内核在紧急清内存时,既没动虚拟机,也没动浏览器,反而把只占几十兆内存的轻量级字符映射小工具 gnome-characters 给一枪崩了。 杀了个几十兆的小工具,却留着几十 G 的虚拟机……这波操作属实把我看傻了。 这种“抓小放大”的离谱判断,暴露出此前系统在缺乏细粒度保护配置下的致命缺陷。 双管齐下,39 个核心服务降分且 oomd 不再无脑掀桌 为了终结这种误杀桌面和盲目惩罚小应用的乱象,Ubuntu 26.10 采取了软硬兼施的双重改进方案: 39 个核心会话服务降分保护:在 ubuntu-settings 26.10.1 中,包括 GNOME Shell 以及两项核心 D-Bus 守护服务在内的 39 个会话服务,其 oom_score_adj 被统一调降至 -500,彻底退出了内核的第一轮被杀名单。 重构 oomd 响应机制:除了内核本身的 OOM Killer,驻留后台的 systemd-oomd 往往会在内核出手前更早介入。此前它在检测到 50% 内存压力时就会直接连坐干掉整个用户会话;新补丁在 user@.service 中将 ManagedOOMMemoryPressure 调整为 auto,取代原先粗暴的“kill”连坐设定,废除了动辄强制退出桌面登录的激进逻辑。 通过让会话核心退守到 -500 的安全防线,外加给后台监控守护进程松绑,系统在面临内存极限压迫时终于学会了精准打击。 实测崩溃率彻底清零,桌面终于稳住了 这套组合拳的效果到底有多显著?在 Canonical 官方公布的极限制压测试中:未应用新补丁前,在低内存高压力场景下 10 次测试有 7 次会直接击穿桌面;而合并新策略之后,桌面崩溃次数直接归零,达成了 10 次崩 7 次直降到 0 次 的突破。 可能也有老哥会问:那我的浏览器和 IDE 还会不会被杀? 答案显而易见:肯定还是会被杀。但作为长期被 OOM 崩溃困扰的 Linux 桌面用户,这种“弃车保帅”恰恰是大家最希望看到的结果。对于把 Ubuntu 当做主力生产力环境的开发者而言,单个占满内存的程序闪退,重启该软件即可继续。但要是整个桌面直接暴毙退回登录界面,所有未保存的文档和工作流瞬间化为乌有,那才是真正的灾难。 目前这项全新策略已随 ubuntu-settings 26.10.1 进驻 Ubuntu 26.10 开发归档,正在征集高内存负载与缺乏交换空间场景下的用户实测反馈。 参考资料 It's FOSS: Ubuntu Would Rather Kill Your Apps Before It Takes Down The Session