安卓apkcpu占用过高_Android CPU占用高问题分析
最近负责的项目中,有一定制客户频繁的抱怨设备在安装一些客户的app组件后,云端采集到的CPU占用率信息一直维持在78%以上,甚至还会出现90%的情况,与此同时,用户也反映了卡顿、耗电快等现象。
为了解决客户这个痛点问题,拿了一台复现设备来分析此CPU高的问题,以下是分析思路和过程,mark一下。
问题现象
设备在刷入原生软件版本时,后台收集到的CPU占用信息大约在27%,正常现象。
而在客户定制版本上,CPU至少在78%,对比两个版本区别,发现定制客户在原生软件版本上多安装了6个APP组件,此类app属于客户自研app,重启机器静置5分钟后,观察CPU信息,占用率没有降低,对这么高cpu占用率吓到了。
CPU问题分析过程
1. 抓Log分析
在客户上报问题后,不管反馈的问题是什么(重启\crash\卡顿等),一旦设备有问题出现,对于研发人员来说,在了解到问题现象后,接下来就是需要一份Log,不能无的放矢。
选区_076.png
上图Log信息,发现后台一直在重复打印如上信息,第一直觉告诉我,会不会截图中log频繁输出导致cpu居高不下的。
于是乎,根据这个怀疑点,首先将以上日志信息注释掉,不让其打印出来,然后对比一下cpu前后使用情况,事实证明我的直觉一向不准,cpu使用率没有什么改善。
2. Android Profiler工具,实时说明CPU使用情况
Android Profiler这个工具就不多说了,简而言之,就是Android Studio自带的分析性能(包括cpu/memory/network)工具。
将现场设备连上USB后,用Android Profiler工具查看CPU使用情况,发现system_process进程的cpu一直维持在80%左右,如下图:
system_cpu.png
利用工具对system_server进程单独采样一段时间,具体看看这段时间内system_server进程在进行什么样的操作,采样信息如图所示:
binder_1.png
binder_2.png
两张图结合起来可以看出,system进程中,十几个binder线程都在轮询工作,即占用cpu,而正是这些线程不断执行任务,才导致system整个进程cpu占用高,那么这些binder线程具体在进行什么操作呢,还需要看单个线程的堆栈信息,如图所示(这里只贴出其中一个线程的堆栈,因为其他线程都是类似的堆栈信息):
binder_trace.png
根据堆栈调用信息,system进程在不断地dump meminfo信息,多个binder线程不断被请求dump meminfo信息,这才引起了cpu一直占用高。
竟然binder线程被请求dump meminfo信息,那么客户端是哪些进程呢,在IPC中,服务端被调用,肯定是有个对端--客户进程发起请求的。
所以还需要排查是哪个客户进程频繁发起服务请求的,查看system进程的binder调用情况,如下图所示:
client&&server_pid.png
根据system进程的binder请求信息,可以看到是进程号为4886、5207、5006这几个客户端进程不断在请求获取么meminfo内存信息的,而这几个进程号对应的包名为:
client_pid.png
这几个应用,正是客户在设备上安装的app,所以基本确认是客户app代码不断请求获取meminfo内存信息导致的,需要优化客户app的代码逻辑,不要不停的获取内存信息,这样频繁请求meminfo信息,导致cpu负载很高,一直居高不下。
问题确认
为了再次确认上述分析的原因,修改接口getMemoryInfo的逻辑,使其直接return返回,不再真正地执行dump meminfo内存信息,重启机器后,cpu占用直接降到40%,正如所料。
现场
未屏蔽
已屏蔽
CPU占用
80%以上
45%
问题总结
有果比有因,需要具体分析到cpu占用高具体是在执行什么操作,打印出问题进程的堆栈信息,才能从代码端解决问题,找到root cause。
以上纯属个人分析这个问题的记载!!!
安卓apkcpu占用过高_Android CPU占用高问题分析相关推荐
- mysql利用cpu率高_MySQL CPU 使用率高的原因和解决方法
用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...
- CPU占用较高及CPU占用不高但无响应问题排查小记
CPU占用不高但交易无响应排查 使用top -c 查看CPU使用情况 发现cpu占用不高,继续排查 使用jstack 应用进程号查看日志 发现ThreadA.ThreadB互相等待对方释放锁资源导致了 ...
- oracle查询cpu占用率高,ORACLE CPU过高的sql查询
1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [root@localhost ~] ...
- cpu占用100_Java项目服务器cpu占用100%解决办法
1.使用命令top查看cpu进程,发现tomcat占用cpu使用率过高 可以看到服务器负载很高,tomcat CPU使用已达到接近300%,内存20%. 2.把进程的栈dump到文件里,以便后面的分析 ...
- windows2008开机占用多少内存_Android内存占用分析
思考的问题: 1.为什么/proc/meminfo中的内存总大小比物理内存小? 2.怎么看Android还剩多少可用内存比较准确? 3.怎么看Kernel的内存占用比较准确? 4.是哪些因素影响了Lo ...
- centos中bash占用cpu_Linux CentOS 进程CPU占用100%木马查杀过程
在安装CentOS-6.9-x86_64-minimal.iso之后因为设置用户密码比较简单,并且没有修改默认的22远程端口,导致短时间被扫描入侵,然后服务器疯狂向外发包,因此被自己搞死过好几次别人的 ...
- linux 进程 kswapd0 cpu占用过高
1核1G虚拟机,启动两个jar后cpu飙升直接卡死,查看cpu及内存占用 发现kswapd0进程cpu占用一直居高不下,于是查询资料,总结如下. swap分区的作用是当物理内存不足时,会将一部分硬盘当 ...
- linux centos7 解决挖矿病毒kthreaddk 高CPU占用
top查看cpu占用,发现kthreaddk cpu占用爆满,kill -9 pid没用,会自动重启,被植入的定时脚本. 输入crontab -l 发现有一个定时任务,如果没有其他的定时任务 ,可以c ...
- php opcache 坑,PHP-FPM占用CPU过高分析及OPcache解决
平时站点CPU使用率都在10%以内,最近发现达到了50%左右 top查看服务器资源使用情况: %Cpu0 : 41.9 us, 1.3 sy, 0.0 ni, 56.1 id, 0.3 wa, 0.0 ...
- sh shell实现自动杀死cpu占用最高的pid,同时当cpu超过95%自动重启apache
实在是被逼无奈,才想出如此招数! 服务器老是被攻击,cpu占用特别高,而且特别高的进程是httpd(我知道有程序漏洞,but程序不是我写的). 第一种情况: httpd的占用已经达到99.8%了 第一 ...
最新文章
- mysql事务拼写_拼写mysql单词
- suse php5,简简单单搭建linux SuSE LAMP环境
- SAP 电商云 Spartacus UI 的 style library 介绍
- 详解CSS的相对定位和绝对定位
- 信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序
- 最近wampserver总是开不开,一直离线,重启就好,各位有何看法?
- php mosquitto,mosquitto 扩展安装php客户端库-Go语言中文社区
- 持续集成最佳实践_集成服务性能最佳实践–数据流优化
- 如何修改html中字号大小,css怎么设置字体大小?
- HTML-参考手册: HTML ASCII
- 帮助文档或使用说明Chm文档打开后,目录都在,内容为空白,如何解决?
- Apache高并发测试工具JMeter
- java怎么写脚本_一名资深牛人写的Java脚本编程指南
- 一款可以精准爬取网站的网络数据采集系统
- PFPLD 人脸关键点检测
- 百度网盘制作百度分享链接
- JRE瘦身 制作小工具
- 模电——三极管各个引脚之间的电压关系
- 笔记本怎么做wifi热点(xp版)
- linux中安装mysql无法启动不了_Linux中安装mysql之后 mysql服务不能启动是怎么回事?...
热门文章
- C#使用Oxyplot绘制监控界面
- Python numpy.column_stack函数方法的使用
- 女生做数据分析师累吗?零基础可以转行吗?
- 明解C语言 入门 课后习题练习答案 第四章(1)
- Cloudera Manager6.3.1+CDH6.3.2本地仓库方式搭建(超详细版)
- 优化算法之粒子群优化
- 游戏开发常遇到数据一致性BUG,怎么解?
- chm文件导入java_java API的chm文件制作
- csdn博客改用户名,取名字慎重
- Win10 微软拼音添加小鹤双拼以及其他配置