You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4B运行Arch Linux无故触发OOM问题求助

树莓派4B(Arch Linux armv7l)低内存使用率下触发OOM问题

问题描述

树莓派4B运行Arch Linux(armv7l架构),执行备份等操作时频繁触发OOM(内存不足),但内存使用率始终低于15%。触发OOM的进程不固定,有时是仅含ping操作的简单脚本net-restart.sh,有时是PostgreSQL清理服务或rsync备份进程。触发后系统会持续终止进程直至崩溃。

已尝试的排查/解决措施:

  • 升级内核及相关组件
  • 添加2GiB交换分区
  • 降低rsync内存占用
  • 添加内存统计日志服务
    均未解决问题,怀疑硬件故障。

关键日志信息

OOM发生前7秒的free -hw输出

23:00:02 free[10890]:                total        used        free      shared     buffers       cache   available
23:00:02 free[10890]: Mem:           3,7Gi        82Mi       3,2Gi       2,0Mi       0,0Ki       442Mi       3,6Gi
23:00:02 free[10890]: Swap:             0B          0B          0B

OOM触发时内核日志

23:00:09 kernel: oom_kill_process: 13 callbacks suppressed
23:00:09 kernel: net-restart.sh invoked oom-killer: gfp_mask=0x400dc0(GFP_KERNEL_ACCOUNT|__GFP_ZERO), order=0, oom_score_adj=0
23:00:09 kernel: CPU: 2 PID: 10992 Comm: net-restart.sh Tainted: G         C         6.1.14-1-rpi-ARCH #1
23:00:09 kernel: Hardware name: BCM2711
23:00:09 kernel:  unwind_backtrace from show_stack+0x18/0x1c
23:00:09 kernel:  show_stack from dump_stack_lvl+0x90/0xac
23:00:09 kernel:  dump_stack_lvl from dump_header+0x54/0x1fc
23:00:09 kernel:  dump_header from oom_kill_process+0x23c/0x248
23:00:09 kernel:  oom_kill_process from out_of_memory+0x218/0x34c
23:00:09 kernel:  out_of_memory from __alloc_pages+0xa98/0x1044
23:00:09 kernel:  __alloc_pages from __pmd_alloc+0x3c/0x1d8
23:00:09 kernel:  __pmd_alloc from copy_page_range+0xcac/0xcc4
23:00:09 kernel:  copy_page_range from dup_mm+0x440/0x5a4
23:00:09 kernel:  dup_mm from copy_process+0xda0/0x164c
23:00:09 kernel:  copy_process from kernel_clone+0xac/0x3a8
23:00:09 kernel:  kernel_clone from sys_clone+0x78/0x9c
23:00:09 kernel:  sys_clone from ret_fast_syscall+0x0/0x1c
23:00:09 kernel: Exception stack(0xf08b1fa8 to 0xf08b1ff0)
23:00:09 kernel: 1fa0:                   b6fd0088 00000001 01200011 00000000 00000000 00000000
23:00:09 kernel: 1fc0: b6fd0088 00000001 b6efae58 00000078 bea210fc 0055d2bc bea2107c 005844e0
23:00:09 kernel: 1fe0: b6fd05a0 bea20f08 b6e2d260 b6e2d684
23:00:09 kernel: Mem-Info:
23:00:09 kernel: active_anon:7451 inactive_anon:603 isolated_anon:0
                                                 active_file:39567 inactive_file:70065 isolated_file:0
                                                 unevictable:0 dirty:143 writeback:0
                                                 slab_reclaimable:3166 slab_unreclaimable:6791
                                                 mapped:23163 shmem:594 pagetables:267
                                                 sec_pagetables:0 bounce:0
                                                 kernel_misc_reclaimable:0
                                                 free:848488 free_pcp:30 free_cma:80063
23:00:09 kernel: Node 0 active_anon:29804kB inactive_anon:2412kB active_file:158268kB inactive_file:280260kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:92652kB dirty:572kB writeback:0kB shmem:2376kB writeback_tmp:0kB kernel_stack:2360kB pagetables:1068kB sec_pagetab>
23:00:09 kernel: DMA free:323468kB boost:0kB min:3236kB low:4044kB high:4852kB reserved_highatomic:0KB active_anon:0kB inactive_anon:0kB active_file:8076kB inactive_file:279068kB unevictable:0kB writepending:0kB present:786432kB managed:664228kB mlocked:0kB bounce:0kB free_pcp:120kB >
23:00:09 kernel: lowmem_reserve[]: 0 0 3188 3188
23:00:09 kernel: DMA: 143*4kB (UMEC) 119*8kB (UMEC) 68*16kB (UMEC) 23*32kB (UEC) 1*64kB (C) 1*128kB (C) 0*256kB 1*512kB (C) 0*1024kB 0*2048kB 78*4096kB (C) = 323540kB
23:00:09 kernel: 110236 total pagecache pages
23:00:09 kernel: 0 pages in swap cache
23:00:09 kernel: Free swap  = 0kB
23:00:09 kernel: Total swap = 0kB
23:00:09 kernel: 1012736 pages RAM
23:00:09 kernel: 816128 pages HighMem/MovableOnly
23:00:09 kernel: 30551 pages reserved
23:00:09 kernel: 81920 pages cma reserved
23:00:09 kernel: Tasks state (memory values in pages):
23:00:09 kernel: [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
23:00:09 kernel: [    242]     0   242    12050     4296    98304        0          -250 systemd-journal
23:00:09 kernel: [    243]     0   243     7022     1837    61440        0         -1000 systemd-udevd
23:00:09 kernel: [    516]    81   516     2843     1047    49152        0          -900 dbus-daemon
23:00:09 kernel: [    550]     0   550     2422     1664    45056        0         -1000 sshd
23:00:09 kernel: [    554]     0   554   196576     7435   167936        0          -999 containerd
23:00:09 kernel: [    651]     0   651   203978    13307   245760        0          -500 dockerd
23:00:09 kernel: [  10882]   978 10882     4543     2764    65536        0             0 systemd-resolve
23:00:09 kernel: [  10888]     0 10888     1097      201    36864        0             0 agetty
23:00:09 kernel: [  10889]   977 10889     6022      965    65536        0             0 systemd-timesyn
23:00:09 kernel: [  10890]     0 10890     2676      341    49152        0             0 free
23:00:09 kernel: [  10897]     0 10897     3543     1493    57344        0             0 systemd-logind
23:00:09 kernel: [  10992]     0 10992     2169      824    40960        0             0 net-restart.sh
23:00:09 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=net-restart.service,mems_allowed=0,global_oom,task_memcg=/,task=systemd-resolve,pid=10882,uid=978
23:00:09 kernel: Out of memory: Killed process 10882 (systemd-resolve) total-vm:18172kB, anon-rss:1548kB, file-rss:9508kB, shmem-rss:0kB, UID:978 pgtables:64kB oom_score_adj:0

问题分析

从内核调用栈看,OOM发生在__alloc_pages阶段,具体是进程克隆(kernel_clone)时分配页表(__pmd_alloc)失败。结合内存信息:

  1. 内存区域分配限制:树莓派4B的ARM架构存在DMA/HighMem内存区域划分,日志显示DMA区剩余内存充足,但可能存在区域权限或连续页分配的隐性限制。
  2. CMA内存占用:系统预留了81920页(约320MiB)CMA内存,若这些内存被占用且无法回收,可能导致内核分配失败。
  3. 内核内存异常:slab_unreclaimable有6791页(约26MiB),虽数值不大,但如果存在缓慢泄漏或碎片问题,长期运行后可能触发分配失败。
  4. 硬件故障:若软件排查无果,需考虑内存模块或主板内存控制器的稳定性问题。

解决建议

1. 调整内核内存参数

  • 禁用或减少CMA预留:编辑/boot/cmdline.txt,添加cma=0或cma=64M,重启系统生效。
  • 启用内存碎片整理:添加page_alloc.shuffle=1到/boot/cmdline.txt,帮助系统优化内存碎片。
  • 调整内存超额分配:执行echo 1 > /proc/sys/vm/overcommit_memory临时允许内存超额分配,永久生效需写入/etc/sysctl.d/99-overcommit.conf。

2. 排查内核内存异常

  • 安装smem工具,执行smem -t -k查看内存使用细节,重点关注内核slab内存的变化趋势。
  • 定期记录cat /proc/slabinfo输出,对比各slab对象的数量和大小,定位是否有持续增长的项。

3. 硬件排查

  • 更换SD卡:劣质SD卡的内存映射问题可能触发异常内存分配。
  • 内存稳定性测试:使用memtester工具,执行memtester 2048 5测试2GiB内存的稳定性。
  • 检查主板:观察树莓派主板是否有电容鼓包、引脚氧化等硬件异常。

4. 优化进程行为

  • 对rsync添加--max-size=100M参数,分批次备份以减少单次内存占用。
  • 限制备份进程内存:用systemd-run --property=MemoryMax=512M rsync ...启动备份任务,避免进程过度占用内存。

内容的提问来源于stack exchange,提问作者jswcom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:38:13