实时监控fps的linux代码,app指标监控 您所在的位置:网站首页 安卓帧率监控软件 实时监控fps的linux代码,app指标监控

实时监控fps的linux代码,app指标监控

2023-12-06 19:50| 来源: 网络整理| 查看: 265

1. 流量:

未root的手机,需要先获取pid,然后通过proc获取uid,然后通过proc/uid_stat获取响应uid的tcp_send/receive

root的手机通过/data/system/packages.list获取对应包名的uid

【查看设备】

adb

adb  devices

adb shell

【查看进程】

ps |grep jingdong

cd /proc/27192/net/

cat dev

2. 内存:

Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。

1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。

2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。

3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。

Dalvik / Native内存应用:

我们使用的malloc、C++ new和java new所申请的空间都是heap空间, C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中

通过dumpsys meminfo + 包名能获得该包当前内存使用情况:

名词解释:

Vss是占用的虚拟内存,如果没有映射实际的内存也算进来。

Rss是占用的物理内存。是共享内存+私有内存。因为共享内存是多个进程共用的,所以存在重复计算。

Pss是占用的私有内存加上平分的共享内存。例如一块1M的共享内存被两个进程共享,那每个进程分500K。各进程的Pss相加基本等于实际被使用的物理内存,所以这个经常是最重要的参数。

Uss是私有内存。

Private Clean: 包括该进程私有的干净的内存。包括前面说的该进程独自使用的so和进程的二进制代码段。Clean内存的好处是在内存紧张时,可以释放物理内存。因为是clean的,所以不需要写回到disk,只需要下次读取该内存(导致缺页错误)时再从disk读入。

Private Dirty: 表示该进程私有的不跟disk数据一致的内存段

Shared Clean: 公共so组件,不会发生变化,不用回写磁盘

Shared Dirty: Android zygote进程的copy-on-write(写时拷贝),当子进程复用资源,且无写入操作时为share dirty ,如果有写入,则进行拷贝,转为private dirty

数据来源:

1. Pss/Shared Dirty/Private Dirty三列是读取了/proc/process-id/smaps文件获取的。它会对每个虚拟内存块进行解析,然后生成数据。

2. Native Heap Size/Alloc/Free三列是使用C函数mallinfo得到的。(C/C++)

3. Dalvik Heap Size/Alloc/Free并非该cpp文件产生,而是android的Debug类生成。

进一步查看:

showmap + PID

上述的细节

综上所述:

VSS >= RSS >= PSS >= USS 测试中关注PSS这个值即可

VSS牵扯到brk+mmap的内存分配机制,可能分配的内存未实际应用

RSS=USS + SharedMem

PSS= USS + SharedMem/Shared count

3. CPU

dumpsys cpuinfo 分母是app uptime - SystemClock.uptimeMillis(),及当前程序运行时间内,是均值

top是经典算法,

从top里取得cpu百分比

虽然查询cpu占用率的工具有很多种,原理上都是一样的,计算cpu上所有进程总的占用率的话依赖于“/proc/stat”文件,计算单个进程的占用率依赖于“/proc/pid/stat”文件。

us:用户态使用的cpu时间比

sy:系统态使用的cpu时间比

ni:用做nice加权的进程分配的用户态cpu时间比

id:空闲的cpu时间比

wa:cpu等待磁盘写入完成时间

hi:硬中断消耗时间

si:软中断消耗时间

st:虚拟机偷取时间

好了,下面说说hi和si

如果程序都没什么问题,那么是没有hi和si的,但是实际上有个硬中断和软中断的概念。比如硬中断,cpu在执行程序的时候,突然外设硬件(比如硬盘出现问题了)机器需要立刻通知cpu进行现场保存工作。这个时候会cpu会出现上下文切换。就是cpu会有一部分时间会被硬中断占用了,这个时间就是hi。相类似,si是软中断的cpu占用时间,软中断是由软件的指令方式触发的。

ni

ni是nice的意思,nice是什么呢,每个linux进程都有个优先级,优先级高的进程有优先执行的权利,这个叫做pri。进程除了优先级外,还有个优先级的修正值。即比如你原先的优先级是20,然后修正值为-2,那么你最后的进程优先级为18。这个修正值就叫做进程的nice值。

对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0,假设内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高,其优先级值(PRI)越低。%nice,就是改变过优先级的进程的占用CPU的百分比,如上例中就是0.5k/2.5k=1/5=20%。

wa

wa指的是CPU等待磁盘写入完成的时间,就是说前提是要进行IO操作,在进行IO操作的时候,CPU等待时间。比如上面那个程序,最后一步,从系统空间到dst硬盘空间的时候,如果程序是阻塞的,那么这个时候cpu就要等待数据写入磁盘才能完成写操作了。所以这个时候cpu等待的时间就是wa。

st

st的名字很生动,偷取。。。是专门对虚拟机来说的,一台物理是可以虚拟化出几台虚拟机的。在其中一台虚拟机上用top查看发现st不为0,就说明本来有这么多个cpu时间是安排给我这个虚拟机的,但是由于某种虚拟技术,把这个cpu时间分配给了其他的虚拟机了。这就叫做偷取。

id

剩下的id就是除了上面那么多cpu处理上下文以外的cpu时间片。当然在这些时间片上,cpu是空闲的。

1.1 /proc/stat文件分析

我们在Linux Shell环境中使用cat命令查看/proc/stat文件。

该文件显示的第一行就是cpu总体的使用情况,每列数值是后面几行逻辑处理器每列数据的相加值,可见该cpu共有4个逻辑处理器(Processor),我们也可以通过/proc/cpuinfo文件去查看该Linux内核的cpu具体情况。我们依据Linux用户手册详细看下第一行cpu数据的每列数据代表的含义。

1)这些数值的单位都是 jiffies,jiffies 是内核中的一个全局变量,用来记录系统启动以来产生的节拍数,在 Linux 中,一个节拍大致可以理解为操作系统进程调度的最小时间片,不同的 Linux 系统内核这个值可能不同,通常在 1ms 到 10ms 之间。

2)cpu 552 56 1496 266573 652 0 224 0 0 0 (以此行为例)

user(552) Time spent in user mode.

从系统启动开始累积到当前时刻,处于用户态的运行时间,不包含 nice 值为负的进程。

nice(56) Time spent in user mode with low priority(nice).

系统启动开始累积到当前时刻,nice 值为负的进程所占用的 CPU 时间。Nice值是类UNIX操作系统中表示静态优先级的数值。 每个进程都有自己的静态优先级,优先级高的进程得以优先运行。

system(1496) Time spent in system mode.

从系统启动开始累积到当前时刻,处于核心态的运行时间。

idle(266573) Time spent in the idle task.

从系统启动开始累积到当前时刻,除 IO 等待时间以外的其他等待时间。

iowait(652) Time waiting for I/O to complete.

从系统启动开始累积到当前时刻,IO 等待时间。(since 2.5.41,内核版本,下同)

irq(0) Time servicing interrupts.

从系统启动开始累积到当前时刻,服务中断时间。(since 2.6.0-test4)

softirq(224) Time servicing softirqs.

从系统启动开始累积到当前时刻,软中断时间。(since 2.6.0-test4)

stealstolen(0) Stolen time, which is the time spent in other operating systems when running in a virtualized environment.

从系统启动开始累积到当前时刻,在虚拟环境运行时花费在其他操作系统的时间。(since 2.6.11)

guest(0) Which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.

从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费的时间。(since 2.6.24)

guest_nice Time spent running a niced guest (virtual CPU for guest operating systems under the control of the Linux kernel).

从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费在nice进程上的时间。(since Linux 2.6.33)

CPU总体占用率:

cpu总的使用时间计算如下:

totalCPUTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest + guest_nice

通常我们都会选择较短的时间进行取样两次cpu数据1和2。

常用cpu占用率方法可描述为:

totalCPUrate = (非空闲cpu时间2-非空闲cpu时间1)/(cpu总时间2-cpu总时间1)x100%

换成变量描述为:

totalCPUrate =( (totalCPUTime2-idle2)-(totalCPUTime1-idle1))/(totalCPUTime2-totalCPUTime1)x100%

/proc//stat与应用程序cpu占有率的计算:

/proc//stat文件分析

我们在Linux Shell环境中使用cat命令查看/proc//stat文件。我们可以先通过top命令获得目标应用的进程id。

pid=1378 进程号

utime=1286 该任务在用户态运行的时间,单位为jiffies

stime=1854 该任务在核心态运行的时间,单位为jiffies

cutime=6 所有已死线程在用户态运行的时间,单位为jiffies

cstime=2 所有已死在核心态运行的时间,单位为jiffies

应用程序cpu的使用时间计算如下:

processCPUTime = utime + stime

processCPUrate = ( processCPUTime2 – processCPUTime1) / (totalCPUTime2 – totalCPUTime1) x100%

4. 启动时间

adb shell am start -W $packageName/$activityName

shell@natrium:/ $ am start -W com.android.calendar/.homepage.AllInOneActivity

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.calendar/.homepage.AllInOneActivity }

Status: ok

Activity: com.android.calendar/.homepage.AllInOneActivity

ThisTime: 77

TotalTime: 77

WaitTime: 92

Complete

adb shell am force-stop com.android.calendar

如此循环

5. App帧率

SurfaceFlinger 是 Android 的一个服务,运行在 Android 的System 进程中,负责管理系统的帧缓冲区,绘制应用程序的UI。Android应用程序会请求SurfaceFlinger服务创建Surface,在上面绘制自己的UI,然后将这个已经绘制好了UI的Surface渲染到设备显示屏上去

清空缓存:

adb shell dumpsys SurfaceFlinger --laten

在开发者选项中有个“ GPU呈现模式分析(Profile GPU rendering,计算adb shell dumpsys gfxinfo中的呈现时间)”功能,在开启这个功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息。在开启这个功能后,重新启动APP,滑动页面然后执行adb命令。

db shell dumpsys $packageName

Draw:表示在Java中创建显示列表部分中,OnDraw()方法占用的时间。

Process:表示渲染引擎执行显示列表所花的时间,view越多,时间就越长

Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间。其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间。

Draw + Process + Execute = 完整显示一帧 ,这个时间要小于16ms才能保存每秒60帧。

定期清零重新记录,避免如何分清哪些数据是上次的。命令: dumpsys SurfaceFlinger --latency-clear



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有