投屏项目中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 ...
随机推荐
- 在K8s中,提供的DNS组件是什么?有什么特性?
在Kubernetes (K8s)集群中,用于内部DNS服务的组件已经从早期的kube-dns过渡到了coredns. kube-dns(已弃用): 在Kubernetes 1.10版本之前,kube ...
- DNS转发器·
实验介绍:dns转发器的作用 当客户端向dns1询问域名对应IP时,如果dns1不是该区域的授权域名服务器,则无法解析域名 dns1会根据转发器转发给dns3,如果dns3能解析,则返回给dns1. ...
- IIS创建和管理虚拟网站
实验介绍: 本文会详细介绍创建虚拟站点的三种方法 一:IP地址建立站点 1.打开安装了IIS的windows,进入ip配置页面. 添加几个ip,我这里添加的是192.168.1.209,192.168 ...
- 使用python进行视频图片提取
操作系统 : Windows 10 [版本 10.0.19043.1165] Python 版本 : 3.9.2_x64 可以借助python代码使用opencv实现,命令行示例代码如下: # pyt ...
- Google搜索操作符:让你秒变搜索专家
搜索引擎对互联网的重要性不言而喻,不过,随着ChatGPT及其类似AI工具的推出,对搜索引擎带来了前所未有的挑战. 因为ChatGPT具有自然语言处理能力,能够更好地理解用户的搜索意图,提供更准确.更 ...
- Dubbo本地调试方法
方法一:用版本号来区分 比如,开发环境上跑的服务版本是1.0.0,那么为了在本地打断点调试某个服务,可以在本地启动,将version设置为2.0.0 服务提供者 @DubboService(versi ...
- Zabbix 配置笔记
Zabbix Server 安装参考 https://www.cnblogs.com/clsn/p/7885990.html 安装脚本 #!/bin/bash #clsn #设置解析 注意:网络条件较 ...
- Vue中虚拟DOM的理解
Vue中虚拟DOM的理解 Virtual DOM是一棵以JavaScript对象作为基础的树,每一个节点称为VNode,用对象属性来描述节点,实际上它是一层对真实DOM的抽象,最终可以通过渲染操作使这 ...
- Django实战之文件上传下载
项目介绍 最近学习django,通过文件上传下载这个小项目,总结下常用的知识点. 做这个案例我有以下需求: 1.要支持一次上传多个文件 2.支持上传后记录上传的数据以及列表展示 3.支持下载和删除文件 ...
- Failed to bind properties under ” to com.zaxxer.hikari.HikariDataSource
1.问题说明 今天配置spring boot多数据源,同时用到了oracle和postgresql,结果配置完毕后启动报这个错. 2.原因分析 忘记添加postgresql驱动了!!! 3.解决方案 ...
