【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文档填充文本填…...
vmware配置centos+配置静态ip联网+更换镜像
centos7配置参考【实战】VMware17虚拟机以及Centos7详细安装教程-CSDN博客 ip配置步骤: 先更改编辑虚拟网络编辑器中的内容 就按照还原默认设置来,设定后就是以上内容,然后一定要记住子网ip和子网掩码 接下来就是NAT设置: 网关…...
广州数据中心服务器搬迁方案
设备搬迁的准备工作涵盖资料准备、环境准备、计划细化等工作。资料准备主要是对旧机房的整理工作,对所搬运的设备进行资料整理,首先对每台设备建立基本情况、位置说明、系统关联性、搬迁批次及工作步骤等的设备档案,然后在档案资料收集完的基…...
uniapp开发钉钉小程序流程
下载开发工具 1、小程序开发工具 登录钉钉开发平台,根据自己的需求下载合适的版本,我这里下载的是Windows (64位)版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …...
河南萌新联赛2024第(一)场:河南农业大学 A D F G H I K
A 造数 题目描述: 给定一个整数 𝑛 ,你可以进行以下三种操作 操作1: 1 操作2; 2 操作3: 2 问最少需要多少次操作可以将 0 转为为 𝑛 。 解题思路 操作1,2,3。操作 3 …...
通信协议_C#实现CAN通信
CAN协议 CAN(Controller Area Network)即控制器局域网络。特点: 多主网络:网络上的任何节点都可以主动发送数据,不需要一个固定的主节点。双绞线:使用双绞线作为通信介质,支持较远的通信距离。…...
【AI工具基础】—B树(B-tree)
B树(B-tree)是一种自平衡的树状数据结构,它能够在保持数据有序的同时,优化大块数据的读写操作,使得查找、顺序访问、插入和删除等操作都能在对数时间内完成。以下是对B树原理的详细描述: 一、定义与特性 …...
STM32智能仓库管理系统教程
目录 引言环境准备智能仓库管理系统基础代码实现:实现智能仓库管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通…...
空间计算开发:Volu的集成开发工具包
在空间计算技术迅速发展的今天,VR和AR项目的开发需求日益增长。Volu,一个面向空间计算赛道的开发者工具,正致力于简化这一过程。本文将深入探讨Volu如何通过其集成环境,为开发者提供一站式的解决方案。 一、定位:空间计算的得力助手 Volu定位为一个专为空间开发设计的集…...
02-Redis未授权访问漏洞
免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…...
Linux——多路复用之poll
目录 前言 一、poll的认识 二、poll的接口 三、poll的使用 前言 前面我们学习了多路复用的select,知道多路复用的原理与select的使用方法,但是select也有许多缺点,导致他的效率不算高。今天我们来学习poll的使用,看看poll较于…...
手机网站怎么做301/在线识别图片百度识图
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cc_net/article/details/10418711 序言 又有两年没有写Blog了, 这2年从做windows phone 到 Android C, 慢慢的很多观念也有所改变了。以前一心想做C#相…...
民间it网站建设/产品网络推广的方法
题目链接 题意: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 分析:树链剖分第一题&#…...
wordpress live2d/一套完整的运营方案
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容…...
成都做网站设/杭州seo中心
抽象类:对类的抽象,抽象其行为特征,分为数据抽象,即类的属性,过程抽象,即类的行为特征。抽象层次:是类的属性、行为抽象,全局进行抽象。是一种自下而上的设计。描述的是一继承关系&a…...
济南商城网站制作/公关公司
0805封装尺寸/0402封装尺寸/0603封装尺寸/1206封装尺寸封装尺寸与功率关系:0201 1/20W0402 1/16W0603 1/10W0805 1/8W1206 1/4W封装尺寸与封装的对应关系04021.0mmx0.5mm06031.6mmx0.8mm08052.0mmx1.2mm12063.2mmx1.6mm12103.2mmx2.5mm18124.5mmx3.2mm22255.6mmx6.5…...
企业邮箱格式怎么填写才正确/深圳网站seo
刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-master 大家好,我是靠写博客督促自己刷题的老三,这一节我们对线栈和队列。 栈和队列基础 在正式开刷之前,我们先了解一…...