首页 > 其他分享 >记一次解决OTA死机重启bug,如何分析与解决措施?!

记一次解决OTA死机重启bug,如何分析与解决措施?!

时间:2024-05-20 18:10:02浏览次数:27  
标签:oom 死机 cma CMA free OTA bug 页面

背景:

平台:stm32mp151平台

什么是OTA?

说起OTA我们应该都不陌生,它是一种可以为设备无损失升级系统的方式,能将新功能远程部署到产品上。

我们不仅可以通过网络下载OTA升级包,也可以通过下载OTA升级包到SD卡或U盘后再对设备升级。

OTA下载方式:

  • 短信方式
  • PUSH方式
  • 网络定制

本例网络定制方式。

现象描述

本产品通过OTA升级测试,升级162次,死机重启19次,如下图所示:

死机重启分析:

1. 为何oom会导致重启?

当需要申请物理页面时,首先使用快通道申请页面,当快通道申请不到将会进入慢通道,当慢通道也无法申请是将触发oom-killer,正常情况下会杀死消耗物理页面最多的进程,而设备直接进入PANIC然后重启。

当申请物理页面时free页面很多情况也会存在页面申请失败的现象,一方面可能内存外碎片化严重,另一方面可能是无法借用其他迁移类型内存。因此尽量不要使能panic_on_oom,但设备使能该参数,如下图所示:

若去掉使能选项,oom-killer将会杀掉物理页最大进程,因此应该杀死蓝牙进程,在升级过程中,杀掉蓝牙进程对业务无任何影响。下图为不开启参数而杀掉最大物理页进程:

2. 为何free页面很多但是还是会进入oom?

当前我们已经知道因/proc/sys/vm/panic_on_oom=1 导致进入oom后便会panic然后重启,但为何内存不足呢?
我们的日志提示还有126M物理页处于空闲可用,不应该会进入内存申请失败的情况。
在这里插入图片描述

细看可知gfp_mask=0x101cc0,则MIGRATE_MOVABLE未置1,导致ALLOC_CMA未置1,既不允许使用cma_pages,

在这里插入图片描述

当CMA页面不允许使用时,实际所剩余可申请的页面数:free减去free_cma,free_cma提示120多M(高达实际物理内存一半),所以剩余非迁移属性的页面只剩几M:

解决措施:

因此除了关闭panic_on_oom,还应该去查查为何free_cma为何可以分配的那么多,而不做最大值限制,通过启动日志可看出系统CMA的最大限制为128M,如下图所示:

CMA我们分配竟然达到了50%物理内存,因此将CMA降成64M大小,以释放64M用于非迁移属性页面申请。通过uboot传参cma=64M,可将cma最大值设置为64M。


在这里插入图片描述

标签:oom,死机,cma,CMA,free,OTA,bug,页面
From: https://www.cnblogs.com/yikoulinux/p/18202545

相关文章

  • Entity Framwork Core 数据注解(Data Annotations)使用方法
    在EntityFrameworkCore中,数据注解(DataAnnotations)是通过在实体类的属性上使用特性(Attributes)来配置实体与数据库之间的映射关系的一种方式。这种方式比较直观且易于理解,特别适用于简单的配置需求。下面是一些使用数据注解配置实体的C#示例:1.配置主键publicclassBlog{......
  • [LeetCode] 1863. Sum of All Subset XOR Totals
    TheXORtotalofanarrayisdefinedasthebitwiseXORofallitselements,or0ifthearrayisempty.Forexample,theXORtotalofthearray[2,5,6]is2XOR5XOR6=1.Givenanarraynums,returnthesumofallXORtotalsforeverysubsetofnums.......
  • CMake 如何设置 Debug 和 Release 下的不同配置
    CMake设置Debug和Release的不同配置 文章目录CMake设置Debug和Release的不同配置I-原因II-如何设置2.1-配置不同的库2.2-配置不同的宏 I-原因由于Debug和Release下工程的依赖库不同,另外,方便定义不同的宏来隔离调试和发布的代码,如......
  • 日常Bug排查-偶发性读数据不一致
    日常Bug排查-偶发性读数据不一致前言日常Bug排查系列都是一些简单Bug的排查。笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材。Bug现场业务场景先描述这个问题出现的业务场景。这是一个支付的场景,如果支付成功了,我们就把支付状态置为success(主单据更新)同时写入支......
  • 解决VSCode中Debug和运行路径不一致的
    哈喽,大家好,我是木头左!背景介绍在VisualStudioCode(简称VSCode)中进行开发时,经常需要使用到调试(Debug)功能。然而,有时候会发现,当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问题,可以在launch.json文件......
  • ./configure --with-debug --prefix=/Users/root/opt/nginx/debug_nginx
    %./configure--with-debug--prefix=/Users/root/opt/nginx/debug_nginxcheckingforOS+Darwin21.6.0x86_64checkingforCcompiler...found+usingClangCcompiler+clangversion:14.0.0(clang-1400.0.29.202)checkingfor-Wl,-Eswitch...notfoundchec......
  • jenkins docker 开启debug 简单说明
    jenkinsdocker镜像为了方便调试,已经内置了一个环境变量可以方便的开启基于jdwp协议的debug处理,以下是一个简单使用参考配置docker-compose文件services:jenkins:image:jenkins/jenkins:ltsenvironment:-DEBUG=trueports:......
  • HTML 09 - Quotations
     QuotationsinHTMLallowyoutoincludeandformatquotedtextwithinyourwebcontent.HTMLprovidestagssuchas<blockquote>,<q>,<cite>,<address>,<bdo>and<abbr>tostructureandstylequotes.Thesetagshelp......
  • npm install bug集
    报错信息gypERR!configureerrorgypERR!stackError:`gyp`failedwithexitcode:1gypERR!stackatChildProcess.onCpExit(/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)gypERR!stackatChildProcess.emit(event......
  • docker debug记录
    Error1:failedtoregisterlayer:open/data1/Installer/dockerInstallDir/docker/overlay2/5ee088aebf668f13b34c528c8009e67fe6aec5592f692dc5425c3e0d32bc4427/.tmp-committed2657031997:nosuchfileordirectory$dockersystemprune-a$systemctlstopdocker......