如题,1G 内存的服务器升级 Ubuntu 26.04 后,每几分钟就 OOM 一次,自动重启服务后过几分钟就又不行了,日志说:
kworker/0:2 invoked oom-killer: gfp_mask=0xdc0(GFP_KERNEL|__GFP_ZERO), order=0, oom_score_adj=0
The kernel OOM killer killed some processes in this unit.
此时,查看剩余内存还有很多:
root@ubuntu:~# free -h
total used free shared buff/cache available
Mem: 907Mi 296Mi 543Mi 1.2Mi 87Mi 611Mi
Swap: 0B 0B 0B
诡异到想破脑袋也想不出来,百思不得其解,幸好这是个 AI 的时代,AI 从日志里发现了端倪:
active_anon:5463 inactive_anon:5697 isolated_anon:0 slab_reclaimable:4871 slab_unreclaimable:25711 mapped:2013 shmem:394 pagetables:801 sec_pagetables:0 bounce:0 free:153942 free_pcp:7 free_cma:153527
root@ubuntu:~# grep -E '^Cma(Total|Free):' /proc/meminfo
CmaTotal: 0 kB
CmaFree: 498088 kB
总空闲内存 153942 个页,按 4kb 折合约 601M ,CMA(Contiguous Memory Allocator ,连续内存分配器)标记了 153527 个页,按 4kb 折合约 600M ,全被 CMA 标记了,不允许某些不可移动的内核内存分配(MIGRATE_UNMOVABLE)。
于是修改 grub ,在/etc/default/grub 的 GRUB_CMDLINE_LINUX 追加 cma=64M ,然后 update-grub 后重启,诡异的是 OOM 还是一直出现。
后来让 AI 深入查询,发现这是 Ubuntu 26.04 的 Linux 7.0 内核默认启用 KHO(Kexec HandOver ,用于热更新内核)获取 scratch memory 引发的内存问题,已经有人提交 bug 了。CmaTotal=0 ,但是 CmaFree 在重启后不固定地出现诡异增加,这是因为有些时候启动时 KHO 的内存会分配失败:
KHO: Failed to reserve nid 0 scratch buffer
KHO: Failed to reserve scratch area, disabling kexec handover
解决方法:
-
先看自己的内核是否启用 KHO ,要是 CONFIG_KEXEC_HANDOVER_ENABLE_DEFAULT=y 就可能中招了
grep CONFIG_KEXEC_HANDOVER_ENABLE_DEFAULT \ /boot/config-$(uname -r) -
修改 grub 配置,在/etc/default/grub 的 GRUB_CMDLINE_LINUX 最后只追加 kho=off 就行了,不用加 cma=64M ,保留原有的配置:
GRUB_CMDLINE_LINUX="kho=off" - update-grub
- reboot
-
重启后一定要通过 cmdline 确认是不是真的 kho=off ,此时诡异的 CMA 内存就没了,问题解决:
root@ubuntu:~# cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-7.0.0-43-generic root=UUID=XXX ro kho=off console=tty1 console=ttyS0root@ubuntu:~# grep -E '^Cma(Total|Free):' /proc/meminfo CmaTotal: 0 kB CmaFree: 0 kB
最后,千万要注意,我试过了在 grub 只设置 cma=0 ,而不关闭 KHO ,一点用都没有,仍然会出现因 free_cma 过多导致的 OOM 内存不足:
root@ubuntu:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-7.0.0-43-generic root=UUID=XXX ro cma=0 console=tty1 console=ttyS0
root@ubuntu:~# grep -E '^Cma(Total|Free):' /proc/meminfo
CmaTotal: 0 kB
CmaFree: 125160 kB