首页 > 其他分享 >投屏项目中Sink端CPU占用过高问题

投屏项目中Sink端CPU占用过高问题

时间:2024-01-10 11:34:44浏览次数:33  
标签:perf stop 投屏 simpleperf data CPU Sink

一、背景

今天来总结一下,自己在项目中遇到的一个CPU占用过高的问题,详细的结束从发现到定位在到解决问题的过程。
原因是性能测试那边提出了一个bug,就是在投屏过程中,平板端也就是Sink端功耗非常高的问题,

二、排查问题

经过排查后发现:需要手机投平板后在手机侧拖动平板断开,平板端的一个进程CPU占用率会一直上升,且每次重复此操作后CPU占用率都会上升,高概率复现

可以输入 adb shell top -m 10 确定排名前10的进程
image

三、使用android Profile工具分析

接下来可以使用Android Studio打开android Profile工具,通过选中自己应用的进程,然后点击CPU可以查看CPU的使用情况。

我们通过复现在Source端断开,可以看到Sink端的cpu使用情况:在断开后,按理说是没有线程在跑的,但是从下图可以看到其中有个线程StreamSinker_Ou一直在使用CPU,那么就可以确认是此线程出问题了。
image

四、使用simpleperf工具

4.1 simpleperf工具介绍

通过上面步骤后,我们可以使用simpleperf工具进行进一步分析:

simpleperf工具是在NDK的根目录下
image
当然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过高.
image

4.2.3 查看perf.log文件

打开perf.log文件我们可以看到占用CPU的具体的地方:是底层的android::StreamSinker::SinkerOutThread::threadLoop()方法
image

五、代码分析

通过上面分析后可以知道是底层的StreamSinker类的SinkerOutThread内部类的threadLoop()方法导致CPU占用过高。
image

此方法是一个wile循环使用一个bool变量进行控制,也就是说在断开后,此bool值没有置为false,控制此bool值为false也就是上图的stop方法里。

通过代码的定位最终定位到了MultiscreenSink类的doMessageReceived方法的kWhatStop条件中
image

而触发此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还未及时发送出去
image

六、问题解决

通过上面代码分析后,知道了具体的问题在哪里,那么接下来就可以更好的解决问题了,具体解决方法这里就不在描述了,只要知道具体问题点了,那么就会有很多方案去处理。

之后解决的效果如下,基本上投屏中CPU占用始终在70%左右,退出投屏此进程也就不在top 10中了。
image

参考:
解决CPU使用过高问题

标签:perf,stop,投屏,simpleperf,data,CPU,Sink
From: https://www.cnblogs.com/zuojie/p/17956110

相关文章

  • macOS Ventura 重启报错 panic(cpu 2 caller 0xffffff800f5b4f23)
    本子:macBookpro系统:macOSVentura13.6.3报错:panic(cpu2caller0xffffff800f5b4f23):Kerneltrapat0xffffff800f5af2a0,type14=pagefault,registers:CR0:0x000000008001003b,CR2:0xffffff7fef252228,CR3:0x000000020c00e175,CR4:0x00000000003626e0RAX:0x......
  • docker 容器cpu限额绑定控制、内存使用、io读写控制及容器停止后自动释放资源
    容器控制cpu使用为避免压力测试时导致虚机爆掉,该测试虚机最好含有四个以上的cpu指定容器可以使用宿主机cpu的份额该参数只对多个容器竞争同一个cpu的时间片时有效参数 -c 或者全称 --cpu-shares可以看到控制cpu的参数使用-c或者全称--cpu-shares[root@localhost~]#......
  • Hadoop 的 ResourceManager进程占用 CPU 100% 问题排查过程
    1.top命令查看进程占用CPU情况top2.查找该进程号(22054)对应的服务方式一:top命令输入后,再按键盘中的“c”字母即可查看方式二:使用:ps-ef|grepPID命令查看ps-ef|grep220543.找到该进程中占用CPU最高的线程top-Hp220544.将线程的ID转换为16进制(用于排查、匹......
  • Stable Diffusion Win10部署,仅使用CPU,20240106
    先决条件:a.下载githttps://git-scm.com/download/winb.如果使用GPU,需要使用cuda,本文档对GPU环境不做讨论https://developer.nvidia.com/cuda-toolkit-archive注:CUDA版本需要和torch版本匹配https://pytorch.org/get-started/locally/    1.下载conda https://docs.conda.io/e......
  • Linux核心组件(CPU,内存,磁盘,网络,进程)
    一、CPU不同组件,每秒的运算、读写次数命令集:lscpu+top/htop/uptime+mpstat+sar#查看CPU静态信息cat/proc/cpuinfo#查看CPU统计信息lscpu uptimeLoadAverage(平均负载):就是一段时间内(1分钟、5分钟、15分钟)内平均Load翻译:一段时间内正在使用和等待使用CPU的平均进程......
  • 【多进程】python多进程CPU密集型任务的进程数选择
    实验思路从1加到100000000,分别用单进程,多进程方案去做。实验代码frommultiprocessingimportPool,Process,Queueimportos,time,randomdeftest_func(left,right):res=0foriinrange(left,right):res+=ireturnresdefjoin(q):......
  • linux如何排查cpu持续飙高原因
    一、检查CPU使用率首先在Linux系统中检查CPU使用率。可以通过在命令行中输入top或htop命令来查看当前系统中各个进程的CPU使用率。如果CPU使用率大于80%,则可以考虑进行排查。$top二、检查系统负载另外可以使用uptime命令来查看系统的平均负载情况。$uptime如果系统负载超过CPU内......
  • 【计算机组成原理】从CPU执行时间聊如何做性能优化
    衡量性能的指标有什么?针对CPU执行时间,我们可以从哪些部分优化?衡量性能的指标:响应时间。执行一个程序需要花费多少时间。带宽(也称为吞吐率)。在一定时间内,能处理多少事情。这里我们主要讨论的是响应时间。一般情况下,我们把性能定义为时间的倒数,性能=1/响应时间,这时候我们就要用时间......
  • 生产系统cpu飙高问题排查
    现状生产系统CPU占用过高,并且进行了报警排查方法执行top命令,查看是那个进程导致的,可以确定是pid为22168的java应用导致的执行top-Hp命令,查看这个进程的那个线程导致cpu过高,如下图,可以看到是22749线程导致的top-Hp22168由于jstack里面的线程号为16进制,需要转换线程号为......
  • 恒创科技:应对服务器CPU占用持续性变高的解决办法
    ​在服务器的使用过程中,高CPU使用率是一个常见的问题,一般是由于遇到大量流量,进程需要更多时间来执行或通过网络发送和接收大量网络数据包时,CPU使用率可能会急剧增加,严重时可能会影响到网络的性能和稳定性。因此,对于站长们来说,面对服务器CPU占用持续性变高时,应采取措施予以处理......