Android性能测试——CPU时间片

发表于:2018-3-08 10:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胖喵    来源:51Testing软件测试网采编

  前言
  第一节讲CPU的时候留下了一个疑问,就是由于Android手机系统本身的缺陷造成采集CPU百分比数据会有很大的误差,那么如何分析CPU这个指标呢?
  这节我们就来讲讲如何用CPU时间片这个指标来衡量系统CPU的占用或者一款App对系统CPU的占用。
  概念
  首先需要知道,在Linux系统下,CPU利用率分为用户态、系统态、空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。(如下图)
  CPU使用率计算公式如下:
  那么我们来看看怎么这个时间究竟是什么?
  先介绍几个和Linux时间有关的名词:HZ、tick与jiffies。
  HZ:Linux 核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。例如HZ为1000,就代表每秒有1000次timer interrupts。
  这是我在Nexus 5 上截取的手机试试的一个cpu频率
  Tick:Tick是HZ的倒数,Tick = 1/HZ 。即timer interrupt每发生一次中断的时间。如HZ为250时,tick为4毫秒(millisecond)。
  Jiffies:Jiffies 为Linux核心变数,是一个unsigned long类型的变量,它被用来记录系统自开机以来,已经过了多少tick。每发生一次timer interrupt,Jiffies变数会被加1.
  所以我们可以得出,CPU利用率计算公式也就是:
  那么如果查看Jiffies 值呢?
  Jiffies
  查看Jiffies的方法,我需要在shell中输入cat /proc/stat命令
  上图中的前5行是我们关注的重点,首先纵向CPU0、CPU1、CPU2、CPU3说明当前手机是四核的CPU,代表了每个核的Jiffies ,第一行CPU 就代表总的的Jiffes。
  而每一列的数值分别代表了(如上图所示),详细的含义如下:
  user :从系统启动开始累计到当前时刻,用户态的jiffies ,不包含 nice值为负进程;
  nice :从系统启动开始累计到当前时刻,nice值为负的进程所占用的jiffies;
  system :从系统启动开始累计到当前时刻,系统态的jiffies;
  idle :从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待的jiffies;
  iowait : 从系统启动开始累计到当前时刻,硬盘IO等待的jiffies;
  irq : 从系统启动开始累计到当前时刻,硬中断的jiffies;
  softirq :从系统启动开始累计到当前时刻,软中断的jiffies。
  总的Jiffies就是上面所有项加起来的总和。因此我们计算一段时间的CPU占用率的时候就可以使用:
  total=user+system+nice+idle+iowait+irq+softirq
  cpu usage=[(user_end +sys_end+nice_end) - (user_begin + sys_begin+nice_begin)]/(total_end - total_begin)*100
  进程的Jiffes
  根据上面的介绍我们已经知道了Jiffies的作用,所以当有的时候我们需要查看一个App的CPU性能时,就需要对该App应用的进程的Jiffies进行分析。获取应用Jiffies的方法这里还是介绍两种,一种是使用GT直接采集,第二种是命令行查看的方式。
  一、GT采集
  如同前一节的方法一样,选择好要采集的应用(以qq为例),勾选Jiffes,开始采集即可。(如下图)
  一般我们关注的是应用的前台进程,从进程名我们可以区分出来:
  使用GT,可以直接查看数据,也可以将源数据保存下来,自己做分析。
  二、shell获取
  shell的命令为: cat /proc/进程id/stat
  首先我们需要使用 ps 命令查看qq这个应用的前台进程的进程id是多少,然后再去查看它的信息,如下图:
  我们可以看到,得到了很多数据,这些数据的含义分别是:
  pid=20324  进程号(平时所说的pid)
  comm=(encent.mobileqq) 应用程序或命令的名字
  task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
  ppid=174 父进程ID
  pgid=174 线程组号
  sid=0 c该任务所在的会话组ID
  tty_nr=0 (pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
  tty_pgrp=-1 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
  task->flags=1077936448 进程标志位,查看该任务的特性
  min_flt=166543 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
  cmin_flt=1212  累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
  maj_flt=454 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
  cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
  utime=8582 该任务在用户态运行的时间,单位为jiffies
  stime=3419 该任务在核心态运行的时间,单位为jiffies
  cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
  cstime=7 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
  priority=20 任务的动态优先级
  nice=0 任务的静态优先级
  .......(内容太多,如需了解自己去查阅资料吧,这里只介绍和本节有关的)
  根据上面每个字段的含义,我们就可以知道,当前进程的我们要的Jiffies值就是utime和stime的和。


上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号