最近负责的项目中,有一定制客户频繁的抱怨设备在安装一些客户的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占用高问题分析相关推荐

  1. mysql利用cpu率高_MySQL CPU 使用率高的原因和解决方法

    用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...

  2. CPU占用较高及CPU占用不高但无响应问题排查小记

    CPU占用不高但交易无响应排查 使用top -c 查看CPU使用情况 发现cpu占用不高,继续排查 使用jstack 应用进程号查看日志 发现ThreadA.ThreadB互相等待对方释放锁资源导致了 ...

  3. oracle查询cpu占用率高,ORACLE CPU过高的sql查询

    1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [root@localhost ~] ...

  4. cpu占用100_Java项目服务器cpu占用100%解决办法

    1.使用命令top查看cpu进程,发现tomcat占用cpu使用率过高 可以看到服务器负载很高,tomcat CPU使用已达到接近300%,内存20%. 2.把进程的栈dump到文件里,以便后面的分析 ...

  5. windows2008开机占用多少内存_Android内存占用分析

    思考的问题: 1.为什么/proc/meminfo中的内存总大小比物理内存小? 2.怎么看Android还剩多少可用内存比较准确? 3.怎么看Kernel的内存占用比较准确? 4.是哪些因素影响了Lo ...

  6. centos中bash占用cpu_Linux CentOS 进程CPU占用100%木马查杀过程

    在安装CentOS-6.9-x86_64-minimal.iso之后因为设置用户密码比较简单,并且没有修改默认的22远程端口,导致短时间被扫描入侵,然后服务器疯狂向外发包,因此被自己搞死过好几次别人的 ...

  7. linux 进程 kswapd0 cpu占用过高

    1核1G虚拟机,启动两个jar后cpu飙升直接卡死,查看cpu及内存占用 发现kswapd0进程cpu占用一直居高不下,于是查询资料,总结如下. swap分区的作用是当物理内存不足时,会将一部分硬盘当 ...

  8. linux centos7 解决挖矿病毒kthreaddk 高CPU占用

    top查看cpu占用,发现kthreaddk cpu占用爆满,kill -9 pid没用,会自动重启,被植入的定时脚本. 输入crontab -l 发现有一个定时任务,如果没有其他的定时任务 ,可以c ...

  9. 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 ...

  10. sh shell实现自动杀死cpu占用最高的pid,同时当cpu超过95%自动重启apache

    实在是被逼无奈,才想出如此招数! 服务器老是被攻击,cpu占用特别高,而且特别高的进程是httpd(我知道有程序漏洞,but程序不是我写的). 第一种情况: httpd的占用已经达到99.8%了 第一 ...

最新文章

  1. mysql事务拼写_拼写mysql单词
  2. suse php5,简简单单搭建linux SuSE LAMP环境
  3. SAP 电商云 Spartacus UI 的 style library 介绍
  4. 详解CSS的相对定位和绝对定位
  5. 信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序
  6. 最近wampserver总是开不开,一直离线,重启就好,各位有何看法?
  7. php mosquitto,mosquitto 扩展安装php客户端库-Go语言中文社区
  8. 持续集成最佳实践_集成服务性能最佳实践–数据流优化
  9. 如何修改html中字号大小,css怎么设置字体大小?
  10. HTML-参考手册: HTML ASCII
  11. 帮助文档或使用说明Chm文档打开后,目录都在,内容为空白,如何解决?
  12. Apache高并发测试工具JMeter
  13. java怎么写脚本_一名资深牛人写的Java脚本编程指南
  14. 一款可以精准爬取网站的网络数据采集系统
  15. PFPLD 人脸关键点检测
  16. 百度网盘制作百度分享链接
  17. JRE瘦身 制作小工具
  18. 模电——三极管各个引脚之间的电压关系
  19. 笔记本怎么做wifi热点(xp版)
  20. linux中安装mysql无法启动不了_Linux中安装mysql之后 mysql服务不能启动是怎么回事?...

热门文章

  1. C#使用Oxyplot绘制监控界面
  2. Python numpy.column_stack函数方法的使用
  3. 女生做数据分析师累吗?零基础可以转行吗?
  4. 明解C语言 入门 课后习题练习答案 第四章(1)
  5. Cloudera Manager6.3.1+CDH6.3.2本地仓库方式搭建(超详细版)
  6. 优化算法之粒子群优化
  7. 游戏开发常遇到数据一致性BUG,怎么解?
  8. chm文件导入java_java API的chm文件制作
  9. csdn博客改用户名,取名字慎重
  10. Win10 微软拼音添加小鹤双拼以及其他配置