投屏项目中Sink端CPU占用过高问题
一、背景
今天来总结一下,自己在项目中遇到的一个CPU占用过高的问题,详细的结束从发现到定位在到解决问题的过程。
原因是性能测试那边提出了一个bug,就是在投屏过程中,平板端也就是Sink端功耗非常高的问题,
二、排查问题
经过排查后发现:需要手机投平板后在手机侧拖动平板断开,平板端的一个进程CPU占用率会一直上升,且每次重复此操作后CPU占用率都会上升,高概率复现
可以输入 adb shell top -m 10 确定排名前10的进程
三、使用android Profile工具分析
接下来可以使用Android Studio打开android Profile工具,通过选中自己应用的进程,然后点击CPU可以查看CPU的使用情况。
我们通过复现在Source端断开,可以看到Sink端的cpu使用情况:在断开后,按理说是没有线程在跑的,但是从下图可以看到其中有个线程StreamSinker_Ou
一直在使用CPU,那么就可以确认是此线程出问题了。
四、使用simpleperf工具
4.1 simpleperf工具介绍
通过上面步骤后,我们可以使用simpleperf工具进行进一步分析:
simpleperf工具是在NDK的根目录下
当然Android设备都会有此工具,因此可以直接使用
4.2 simpleperf工具使用
4.2.1 抓取进程数据
simpleperf record -p 30382 --call-graph fp -o data/perf.data
执行完上面命令后,就会在data目录下生成perf.data文件
4.2.2 解析进程数据
simpleperf report -g -i data/perf.data > data/perf.log
执行完上面命令后,就可以将生成的perf.data文件解析出perf.log文件,此文件方便我们来判断具体是哪里占用CPU过高.
4.2.3 查看perf.log文件
打开perf.log文件我们可以看到占用CPU的具体的地方:是底层的android::StreamSinker::SinkerOutThread::threadLoop()
方法
五、代码分析
通过上面分析后可以知道是底层的StreamSinker
类的SinkerOutThread
内部类的threadLoop()
方法导致CPU占用过高。
此方法是一个wile
循环使用一个bool
变量进行控制,也就是说在断开后,此bool
值没有置为false
,控制此bool
值为false
也就是上图的stop
方法里。
通过代码的定位最终定位到了MultiscreenSink
类的doMessageReceived
方法的kWhatStop
条件中
而触发此kWhatStop
条件是在MultiscreenSink
类的stop
方法中
status_t MultiscreenSink::stop(void) {
LOGD(NEGOTIATE_DEBUG,"stop prepare send kWhatStop messg");
sp<AMessage> msg = new AMessage(kWhatStop, mWorkHandler);
msg->post();
return OK;
}
我们在通过复现时的日志可以发现:刚调用stop
方法,就开始走了MultiscreenSink
类的析构方法,导致stop方法里AMessage还未及时发送出去
六、问题解决
通过上面代码分析后,知道了具体的问题在哪里,那么接下来就可以更好的解决问题了,具体解决方法这里就不在描述了,只要知道具体问题点了,那么就会有很多方案去处理。
之后解决的效果如下,基本上投屏中CPU占用始终在70%左右,退出投屏此进程也就不在top 10中了。
参考:
解决CPU使用过高问题
投屏项目中Sink端CPU占用过高问题的更多相关文章
- 项目中Map端内存占用的分析
最近在项目中开展重构活动,对Map端内存尽量要省一些,当前的系统中Map端内存最高占用大概3G左右(设置成2G时会导致Java Heap OOM).虽然个人觉得占用不算多,但是显然这样的结果想要试 ...
- 工具运行过程中,CPU占用过高的分析定位
之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍 ...
- 记一次用arthas排查jvm中CPU占用过高问题
记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...
- 一次java Cpu占用过高的排查
某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了排查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息 ...
- 【笔记】排查CPU占用过高
本文是该教程视频的笔记 https://www.bilibili.com/video/BV15T4y1y7eH 1. 问题演示 将演示项目打包放到服务器运行 执行 curl http://localh ...
- Android去除CPU占用过高时屏幕四周闪红框
话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...
- 性能测试问题_Mysql数据库服务器的CPU占用很高
MySQl服务器CPU占用很高 1. 问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 ...
- java 一次CPU占用过高问题的排查及解决
最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID ...
- kswapd0 进程CPU占用过高
前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...
- 一次单核CPU占用过高问题的处理
客户现场反馈,top的检查结果中,一个CPU的占用一直是100%.实际上现场有4个CPU,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发现re ...
随机推荐
- Shopee x JuiceFS:ClickHouse 冷热数据分离存储架构与实践
本文来自 shopee 技术团队 摘要 Shopee ClickHouse 是一款基于开源数据库 ClickHouse 做二次开发.架构演进的高可用分布式分析型数据库.本文将主要介绍 Shopee C ...
- postman application/json;
看来以后需要都统一使用这个json比较方便. 首先看下 spring boot 项目接口的返回: 当然若不加,他默认可能也是 UTF-8,还是加一下吧.这样就可以了,保证以后 请求和响应的 conte ...
- MYSQL-另一种行转列的实现方式
行转列的实现方式:使用mysql.help_topic --行转列 SELECT b.help_topic_id, substring_index( a.levels, ',', b.help_top ...
- Spring Boot 单元测试笔记
1. 导入JUnit5测试框架 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- NC214362 第k小
题目链接 题目 题目描述 有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数.比如 1 2 2 3 4 6 中,第 3 小的数就是2. 牛牛觉得这个游戏太简单了,想加一点难度,现在 ...
- 【Unity3D】缩放、平移、旋转场景
1 前言 场景缩放.平移.旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换. 对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那 ...
- 《深入理解Java虚拟机》(六) 调优策略 -- 笔记
目录 一.操作文档类功能,大量大对象直接进入老年代 问题现象 解决方法 通过单一Java虚拟机管理大量的内存 同一台服务器上部署若干Java虚拟机 二.异步请求大量累积 三.排查问题 排查问题: 可能 ...
- dllimport 和 dllexport
Dll 在需要暴露接口的头文件里添加 dllexport 声明,比如, #define DllExport __declspec( dllexport ) class DllExport C { in ...
- win32 - WM_DROPFILES的用法
WM_DROPFILES: 当用户将文件拖放到已注册为丢弃文件的接收者的应用程序窗口中时发送该消息 我们可以利用这个消息获取文件名称,并将它们保存到容器里. LRESULT CALLBACK Stat ...
- ASP.NET Core 微信支付(三)【查询订单 APIV3】
官方参考资料 查询订单 理论实战 官方提供两种查询订单的方式,一种是根据商户自己生成的订单号查询,一种方式是根据微信生成的订单号查询.而我使用的就是第一种方式. 调用微信支付的查询订单,需要生成签名, ...