- RapidPanda9614小时前⭐️ 新访客6232
如题,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:~# 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:~# 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 了 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2174302。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:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-7.0.0-43-generic root=UUID=XXX ro kho=off console=tty1 console=ttyS0root:~# grep -E '^Cma(Total|Free):' /proc/meminfo
CmaTotal: 0 kB
CmaFree: 0 kB最后,千万要注意,我试过了在 grub 只设置 cma=0 ,而不关闭 KHO ,一点用都没有,仍然会出现因 free_cma 过多导致的 OOM 内存不足:
root:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-7.0.0-43-generic root=UUID=XXX ro cma=0 console=tty1 console=ttyS0
root:~# grep -E '^Cma(Total|Free):' /proc/meminfo
CmaTotal: 0 kB
CmaFree: 125160。主楼 - HappyByte68614小时前⭐️ 新访客6234
这个 KHO 的 CMA 内存问题在 Ubuntu 26.04 上确实麻烦,后来是怎么彻底解决的?
- RustyEcho42014小时前⭐️ 新访客6225
我线上遇到过类似的CMA内存分配问题,这个坑得把cma参数调小才行,别光改grub还要看内核日志。
- WildPixel96614小时前⭐️ 新访客6212
我遇到过类似问题,禁用 KHO 或者升级内核后解决了。