当前位置:网站首页>ANR 原理及实践
ANR 原理及实践
2022-07-07 02:28:00 【Little xian】
Broadcast ANR 设计原理
- 只在有序广播中才会有ANR的监控
- AMS负责分发有序广播,并在分发的时候设置超时监控报警,如果广播接收者在超时时间范围内处理掉消息并和AMS通信取消本次超时监控则不会发生ANR,反之未取消则判定ANR。
- AMS是用过Binder机制和APP进程通信,当接受到广播数据,会封装数据再sendMessage到主线程消息队列,主线程处理Msg,最终调用receiver.onReceive方法。(当主线程消息队列前面有耗时任务,或者其他进程有耗时任务,影响了当前事件的调度,而不是本身事件耗时过长,也会引发ANR)
Service ANR 设计原理
Input ANR 设计原理
ANR Dump流程
- 过滤掉特殊场景(正在dump,正在关机,正在crash,正在被系统kill)
- 查找需要Dump的进程,主要包括ANR进程的父进程,SystemServer进程,高CPU的(最多5个)进程
- 发送SIGQUIT信号给需要Dump的进程
- 各进程SignalCatcher线程收集当前虚拟机信息,内存信息,class信息,GC信息,再挂起所有线程,获取线程的堆栈信息
- 最后通过管道发送给SystemServer,追加写入到Trace文件中
应用检测ANR
- watchdog
- 监听SIGNALQUIT信号,确定自己进程ANR时候,Java端获取堆栈信息,或者反射调用虚拟机内部Dump线程的堆栈接口,获取数据输出到自己的目录下。
实现参考Xcrash:https://github.com/iqiyi/xCrash/blob/master/README.zh-CN.md
获取ANR Info
- 通过ActivityManagerService.getProcessesInErrorState,遍历mLruProcesses,并根据进程目前的异常状态如crash或者anr类型,返回具体的ProcessErrorStateInfo
ANR出现前消息队列中耗时情况
- 当前 Trace 堆栈所在业务耗时严重;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有一个严重耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有多个消息耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度存在巨量重复消息(业务频繁发送消息);
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他线程存在严重资源抢占,如 IO,Mem,CPU;
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他进程存在严重资源抢占,如 IO,Mem,CPU;
ANR日志语义分析
Load: 2.62 / 2.55 / 2.25
表示:1、5、15 分钟内正在使用和等待使用CPU 的活动进程的平均数CPU usage from 0ms to 1987ms later (2020-03-10 08:31:55.169 to 2020-03-10 08:32:17.156)
表明:负载信息抓取在ANR发生之后的0~1987ms。同时也指明了ANR的时间点:2020-03-10 08:31:55.169
如果是 CPU usage xxx awake 表示是ANR之前的系统负载信息41% 2080/system_server: 28% user + 12% kernel / faults: 76445 minor 180 major 26% 9378/com.xiaomi.store: 20% user + 6.8% kernel / faults: 68408 minor 68 major
表示:各个进程占用的CPU的详细情况66% TOTAL: 20% user + 15% kernel + 28% iowait + 0.7% irq + 0.7% softirq
表示:各进程合计占用CPU的信息
ANR 关键字
a. user:用户态,kernel:内核态
b. faults:内存缺页,minor——轻微的,major——重度,需要从磁盘拿数据
c. iowait:IO使用(等待)占比
d. irq:硬中断,softirq:软中断
e. utm: user space time,stm: kernel space time
参考:
边栏推荐
- 一条慢SQL拖死整个系统
- "Parse" focalloss to solve the problem of data imbalance
- Abnova 膜蛋白脂蛋白体技术及类别展示
- FlexRay通信协议概述
- [shell] summary of common shell commands and test judgment statements
- FPGA课程:JESD204B的应用场景(干货分享)
- Installing redis and windows extension method under win system
- impdp的transform参数的测试
- 使用TCP/IP四层模型进行网络传输的基本流程
- 面试中有哪些经典的数据库问题?
猜你喜欢
屏幕程序用串口无法调试情况
2022Android面试必备知识点,一文全面总结
Redhat5 installing vmware tools under virtual machine
unity3d学习笔记
雷特智能家居龙海祁:从专业调光到全宅智能,20年专注成就专业
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
Abnova 体外转录 mRNA工作流程和加帽方法介绍
Redis (II) - redis General Command
地质学类比较有名的外文期刊有哪些?
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
随机推荐
程序员的日常 | 每日趣闻
当前发布的SKU(销售规格)信息中包含疑似与宝贝无关的字
Performance comparison between Ceres solver and g2o
力扣62 不同路径(从矩阵左上到右下的所有路径数量) (动态规划)
leetcode 509. Fibonacci Number(斐波那契数字)
直击2022ECDC萤石云开发者大会:携手千百行业加速智能升级
VIM mapping large K
Array proof during st table preprocessing
Jmeter 5.5版本发布说明
Abnova 免疫组化服务解决方案
Redhat5 installing vmware tools under virtual machine
Can't you really do it when you are 35 years old?
Unable to debug screen program with serial port
c语言(结构体)定义一个User结构体,含以下字段:
拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
Wechat applet hides the progress bar component of the video tag
Kotlin之 Databinding 异常
屏幕程序用串口无法调试情况
dolphinscheduler3. X local startup