Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
TonyBoney
V2EX  ›  Linux

Ubuntu 26.04 遇到 free -h 和 htop 查不出来的诡异 OOM 内存不足,由 KHO 的 CMA 导致

  •  
  •   TonyBoney · 31 mins ago · 66 views

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

    解决方法:

    1. 先看自己的内核是否启用 KHO ,要是 CONFIG_KEXEC_HANDOVER_ENABLE_DEFAULT=y 就可能中招了
      grep CONFIG_KEXEC_HANDOVER_ENABLE_DEFAULT \
      /boot/config-$(uname -r)
      
      
    2. 修改 grub 配置,在/etc/default/grub 的 GRUB_CMDLINE_LINUX 最后只追加 kho=off 就行了,不用加 cma=64M ,保留原有的配置:
      GRUB_CMDLINE_LINUX="kho=off"
      
    3. update-grub
    4. reboot
    5. 重启后一定要通过 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=ttyS0
      
      root@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
    
    
    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1826 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:58 · PVG 18:58 · LAX 02:58 · JFK 05:58
    ♥ Do have faith in what you're doing.