• RapidPanda96

    如题,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=ttyS0

    root:~# 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。

    主楼
  • HappyByte686

    这个 KHO 的 CMA 内存问题在 Ubuntu 26.04 上确实麻烦,后来是怎么彻底解决的?

    #1
  • RustyEcho420

    我线上遇到过类似的CMA内存分配问题,这个坑得把cma参数调小才行,别光改grub还要看内核日志。

    #2
  • WildPixel966

    我遇到过类似问题,禁用 KHO 或者升级内核后解决了。

    #3

发表回复

登录后回复