【Android性能优化】Android CPU占用率检测原理和优化方向
【Android性能优化】Android CPU占用率检测原理和优化方向
CPU相关知识
-
CPU占用的基本计算公式
(1 - 空闲态运行时间/总运行时间) * 100% -
Hz、Tick、Jiffies:
Hz:Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。
通过getconf CLK_TC
命令,可以查看当前系统的Hz。以某某项目为例,Hz为100。
130|console:/ # getconf CLK_TCK
100
Tick:Tick = 1/Hz,即多久发出一次timer interrupt。
以上述情况为例,则为10ms发生一次。
Jiffies:Jiffies是Linux的核心变数。用于记录系统启动后发生timer interrupt的次数,timer interrupt每发生一次,jiffies增加一次。Jiffies可以认为是Linux下CPU的单位时间;
- user、nice、system、idle、iowait、irq、softirq
kernel/Documentation/filesystems/proc.txt
1.8 Miscellaneous kernel statistics in /proc/stat
-------------------------------------------------Various pieces of information about kernel activity are available in the
/proc/stat file. All of the numbers reported in this file are aggregates
since the system first booted. For a quick look, simply cat the file:> cat /proc/statcpu 2255 34 2290 22625563 6290 127 456 0 0 0cpu0 1132 34 1441 11311718 3675 127 438 0 0 0cpu1 1123 0 849 11313845 2614 0 18 0 0 0intr 114930548 113199788 3 0 5 263 0 4 [... lots more numbers ...]ctxt 1990473btime 1062191376processes 2915procs_running 1procs_blocked 0softirq 183433 0 21755 12 39 1137 231 21459 2263The very first "cpu" line aggregates the numbers in all of the other "cpuN" lines. These numbers identify the amount of time the CPU has spent performing different kinds of work. Time units are in USER_HZ (typically hundredths of a second). The meanings of the columns are as follows, from left to right:- user: normal processes executing in user mode
- nice: niced processes executing in user mode
- system: processes executing in kernel mode
- idle: twiddling thumbs
- iowait: In a word, iowait stands for waiting for I/O to complete. But thereare several problems:1. Cpu will not wait for I/O to complete, iowait is the time that a task is waiting for I/O to complete. When cpu goes into idle state for outstanding task io, another task will be scheduled on this CPU.2. In a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the iowait of each CPU is difficult to calculate.3. The value of iowait field in /proc/stat will decrease in certainconditions.So, the iowait is not reliable by reading from /proc/stat.
- irq: servicing interrupts
- softirq: servicing softirqs
- steal: involuntary wait
- guest: running a normal guest
- guest_nice: running a niced guest
- 第一行数字是其他所有CPUN行中的数字总和;
- 这些数字表示CPU执行不同工作花费的时间,时间单位为USER_HZ,一般为10ms,从左到右,各列的含义如下
标题 | 含义 |
---|---|
user | 在用户模式下执行的正常进程 |
nice | niced进程在用户模式下执行 |
system | 在内核模式下执行的进程 |
idle | 空闲 |
iowait | 总而言之,iowait代表等待I/O完成。但是 存在以下几个问题: 1.Cpu不会等待I/O完成,iowait是任务等待I/O完成的时间。当cpu为未完成的任务io进入空闲状态时,将在该cpu上调度另一个任务。 2.在多核CPU中,等待I/O完成的任务不在任何CPU上运行,因此每个CPU的iowait很难计算。 3./proc/stat中iowait字段的值将在一定程度上减少 条件 因此,从/proc/stat读取iowait是不可靠的。 |
irq | 服务中断 |
softirq | 服务软中断 |
steal | 非自愿等待时间,另一个解释是其它系统所花的时间 |
guest | 执行时间为客户操作系统下的虚拟CPU控制 |
guest_nice | 低优先级程序所占用的用户态的cpu时间 |
- Cpu花费时间总和cpuTime = user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice;
计算整机CPU占用率
根据上面的公式,我们可以采取两个时间点计算CPU总时间差值和CPU空闲时间IDLE的差值,以此得出CPU使用率;
采样两个足够短的时间间隔的cpu数据,分别记作t1、t2,其中t1、t2的结构均为:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest、guest_nice)的10元组;(当然这里依据Linux内核的不同有些数据可能没有,就不必计入)计算t1、t2总的cpu时间片totalCPUTime
a) 把第一次的所有cpu10元组数据求和,得到totalCPUTime1;
b) 把第二次的所有cpu10元组数据求和,得到totalCPUTime2;计算空闲时间idle
cpu空闲时间对应第四列的数据
a)获得第一次的idle数据,记为idle1
b)获得第二次的idle数据,记为idle2计算cpu使用率
totalCPUrate = 1 - ((totalCPUTime2-idle2)-(totalCPUTime1-idle1))/(totalCPUTime2-totalCPUTime1)x100%
计算某个进程CPU占用率
kernel/msm-5.4/Documentation/filesystems/proc.txt
The stat filecontains details information about the process itself. Its fields are explained in Table 1-4.Table 1-4: Contents of the stat files (as of 2.6.30-rc7)
..............................................................................Field Contentpid process idtcomm filename of the executablestate state (R is running, S is sleeping, D is sleeping in anuninterruptible wait, Z is zombie, T is traced or stopped)...cmaj_flt number of major faults with child'sutime user mode jiffies utime指进程在用户态的运行时间stime kernel mode jiffies ;stime指进程在内核态的运行时间cutime user mode jiffies with child's utime指所有子进程在用户态的运行时间总和cstime kernel mode jiffies with child's cstime指所有子进程在核心态的运行时间总和priority priority levelnice nice levelnum_threads number of threadsit_real_value (obsolete, always 0)start_time time the process started after system bootvsize virtual memory sizerss resident set memory sizersslim current limit in bytes on the rssstart_code address above which program text can run
...
这里只关注 utime、 stime、 cutime、 cstime,它们的总和就是该进程的CPU时间。取两个时间点进行采样并取差值,就可以得到这段时间内的该进程所占用的CPU时间片。
scheduledTime = utime + stime + cutime + sctime;
if (lastCpuTime && lastScheduledTime)cpuUsage = (scheduledTime - lastScheduledTime) * 100. / (cpuTime - lastCpuTime);
lastScheduledTime = scheduledTime;
lastCpuTime = cpuTime;
优化的基本思路和方向
- 确定CPU占用高的进程,使用top命令查看;
- 确定该进程CPU占用高的线程,
top -p <PID>
查看线程状态和线程CPU; - 结合logcat命令和trace工具,确定该线程处于什么工作逻辑中以及相关方法耗时,(实在找不到就打断点,加日志,控制变量法);
- 频繁报错 —> 解决报错;
- 过度绘制 —> 重新布局绘制;
- 解码/编码 —> 排查具体算法逻辑;
- 频繁调用 —> 确定各个调用者,并协调修改;
- …
相关文章:
【Android性能优化】Android CPU占用率检测原理和优化方向
【Android性能优化】Android CPU占用率检测原理和优化方向 CPU相关知识 CPU占用的基本计算公式 (1 - 空闲态运行时间/总运行时间) * 100% Hz、Tick、Jiffies: Hz:Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有…...

AWS Certified Developer Associate备考笔记
AWS Certified Developer Associate备考笔记 缓慢更新中,如果你也正在关注该考试,请点赞后评论感兴趣的章节,可加快我的更新速度 😃 文章目录 AWS Certified Developer Associate备考笔记一、IAM二、EC2三、EC2 Instance Storage…...
数据质量8个衡量标准
在数据驱动的时代,数据质量对于企业的决策和业务运营至关重要。为了确保数据的有效性和可靠性,我们需要根据一些关键要素来衡量数据的质量。本文将介绍数据质量的8个衡量标准,包括准确性、精确性、真实性、及时性、即时性、完整性、全面性和关…...
Redis 跳跃列表与紧凑列表
Redis 跳跃列表(Skip List) 跳跃列表是一种高效的数据结构,它结合了有序数组和链表的优点,能够在 O(log n) 时间内进行插入、删除和查找操作。Redis 使用跳跃列表来实现有序集合(sorted set)的底层数据结构…...

达梦数据库的系统视图v$arch_status
达梦数据库的系统视图v$arch_status 在达梦数据库(DM Database)中,V$ARCH_STATUS 是一个动态性能视图(Dynamic Performance View),用于显示归档日志的状态信息。这个视图可以帮助数据库管理员监控和管理数…...
【Rust光年纪】Rust 中常用的数据库客户端库:核心功能与使用场景
探秘 Rust 语言下的多种数据库客户端库:从安装到实际应用 前言 在现代的软件开发中,数据库是不可或缺的一部分。为了与数据库进行交互,开发人员需要使用各种数据库客户端来执行操作、构建查询等。本文将介绍一些用于 Rust 语言的常见数据库…...

网络安全防御【防火墙双机热备带宽管理综合实验】
目录 一、实验拓扑图 二、实验要求 三、实验思路: 四、实验步骤: 1、FW3的网络相关配置: 2、FW1的新增配置: 3、交换机LSW6(总公司)的新增配置: 4、双机热备技术配置(双机热…...

19.x86游戏实战-创建MFC动态链接库
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...
图论建模技巧搜集
一些经典题目 找可达路径 UVa - 11604 General Sultan 平面图最小割对偶图最短路 UVa - 1376 Animal Run 最小割建模 UVa - 1515 Pool construction 费用流建模 洛谷P3159 [CQOI2012] 交换棋子 一些可以转化为二分图最大权匹配的建模题 UVa1006/LA2238 Fixed Partition Me…...

pytorch学习(九)激活函数
1.pytorch常用激活函数如下: #ReLU激活函数 #Leaky ReLU激活函数 #Sigmoid激活函数 #Tanh激活函数 #Softmax激活函数 #Softplus2.代码 import torch.nn as nn import torch import numpy from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter…...
conda 环境打包与使用
conda 环境导出 使用 Conda 打包环境,可以创建一个可重复使用的环境文件,便于在不同的机器上重新创建相同的环境。以下是具体的步骤: 1. 创建 Conda 环境 如果你还没有创建一个 Conda 环境,可以使用以下命令创建一个新环境&…...

jenkins 插件版本冲突
一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…...
Python print() 格式化输出
Python print{} 格式化输出 1. print()2. 浮点数 (float)References 1. print() 传递给函数的值称为参数。 引号没有打印在屏幕上,它们只是表示字符串的起止,不是字符串的一部分。可以用这个函数在屏幕上打印出空行,只要调用 print() 就可以…...
【Qt+opencv】计时函数与图像变换
文章目录 前言计算时间函数图像变换旋转镜像缩放 总结 前言 在图像处理和计算机视觉的应用中,我们经常需要对图像进行各种变换,如旋转、缩放、剪切等。同时,为了评估算法的性能,我们也需要对代码的执行时间进行精确的测量。OpenC…...

nodejs下载+react安装
一、nodejs安装 1、nodejs下载 具体安装可参考连接:2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了_nodejs安装及环境配置-CSDN博客 下载地址:Node.js — 下载 Node.js 测…...
linux service小例
linux service 测试 1.创建一个app // myapp.c // 间隔10s写入时间到文件 #include <stdio.h> #include <time.h> #include <unistd.h> // 引入unix标准函数定义,如sleep()int main() {FILE *fp;time_t now;char buffer[80];// 打开文件以追加模…...

iOS 开发包管理之 Swift Package Manager
这是由官方推出,用于管理分发 swift 代码的工具。这个在 Xcode 是天然的存在,就是说我们不用安装就能够直接使用。 File > Add Package Dependencies… 在弹出来窗口选择一些库来导入 又或者点左下角的“” > Add Package Collection… 添加完成…...

【C语言初阶】C语言数组基础:从定义到遍历的全面指南
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言函数 🌹🌹期待您的关注 🌹🌹 ❀数组 📒1. 什么是数组…...
AI开源战争的真相
引言 在AI技术迅猛发展的今天,开源与闭源之争成为了AI圈内最热的话题之一。大模型免费开放的背后到底隐藏着什么样的真相?这是一个令人困惑的问题。本文将深入探讨开源与闭源之争的历史背景、技术演进以及商业利益的博弈。 开源概念的起源 开源软件的…...
使用Java填充Word模板的技术详解
目录 概述常见的Java Word处理库 Apache POIAspose.Words for JavaDocx4j 使用Apache POI填充Word模板 创建和读取Word文档填充文本填充表格 使用Aspose.Words for Java填充Word模板 创建和读取Word文档填充文本填充表格 使用Docx4j填充Word模板 创建和读取Word文档填充文本填…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...