前言

最近,在看戴铭老师关于 “性能监控” 相关的技术分享,感觉收获很多。基于最近的学习,总结了一些性能监控相关的实践,并计划落地一系列 “性能监控” 相关的文章。

目录如下:

  1. iOS 性能监控(一)—— CPU功耗监控

  2. iOS 性能监控(二)—— 主线程卡顿监控

  3. iOS 性能监控(三)—— 方法耗时监控

本篇将介绍iOS性能监控工具(QiLagMonitor)中与 “CPU功耗监控” 相关的功能模块。

1

了解CPU架构

CPU(Central Processing Unit):中央处理器。

主要由 “运算器” 、 “控制器” 、 “寄存器” 三部分组成。

运算器 :负责一些运算操作。(运算)

控制器 :负责发出CPU每条指令所需的信息。(发指令)

寄存器 :负责存储运算过程或者指令操作的一些临时文件。(存数据)

CPU有“处理指令”、“执行操作”、“控制时间”、“处理数据”四大作用。与我们人体的大脑类似,帮助我们完成各种各样的生理活动。

市场上,我们比较熟悉的CPU架构有ARM(arm64)和Intel(x86)等等。

问:那么对于我们iPhone而言,有哪些CPU架构呢?

目前,市场上大部分的iPhone都是基于arm64架构。(iPhone 5s之后)

因为arm架构有着功耗低的特点,因此广泛应用在移动设备领域。(intel虽然性能好,但功耗高。因此失去了移动端领域的市场份额。)

PS:CPU与GPU比较?

GPU是图像处理器。在大部分计算机中,GPU仅仅会用来绘制图像。它会迅速算出当前屏幕的所有像素,并在显示器上绘制出来。

2

iOS如何监控CPU功耗?

说一下QiCPUMonitor的大致实现思路。

  • 首先,获取当前的任务task。从任务task中获得当前所有存活的线程信息。这时,我们就拿到了当前任务所有存活的 “线程信息”(threads) 和 “存活的线程个数”(threadCount) 。

  • 然后,设置一个预定的CPU使用阈值。遍历所有线程的信息,查看是否有线程的CPU使用率cpu_usage “超过” 预定的阈值(例如CPU使用率超过80%)。

  • 如果有线程的CPU使用率cpu_usage超过预定阈值,就 “存储” 当前线程的调用的堆栈信息。

3

QiCPUMonitor的具体实现

首先,介绍一下存储单个线程信息的结构体thread_basic_info。

struct thread_basic_info {time_value_t    user_time;      // 用户运行时长time_value_t    system_time;    // 系统运行时长integer_t       cpu_usage;      // CPU使用率(理论上限为1000)policy_t        policy;         // 调度策略integer_t       run_state;      // 运行状态integer_t       flags;          // 各种标记integer_t       suspend_count;  // 暂停线程的计数integer_t       sleep_time;     // 休眠时间
};
名称 介绍
user_time 用户运行时间(精确到微妙)。
system_time 系统运行时(精确到微妙)。
cpu_usage cpu使用率(理论上限1000)。
policy 调度策略。
run_state 五种 “运行状态”:
1> running 运行中
2> stopped 已停止
3> waiting 等待中
4> uninterruptible 不可中断
5> halted 被阻塞
flags 三种 “线程标志”:
1> swapped 换出
2> idle 空闲
3> global forced idle 全局强制空闲。
suspend_count 线程已经被挂起的计数。
sleep_time 线程已经挂起的时间(精确到秒)。

其次,声明三个变量:threads、threadCount、thisTask

分别表示:

参数名 参数含义
threads 用来存储当前任务task下的所有线程信息。
threadCount 用来存储有几条线程。
thisTask 用来存储当前任务task。
thread_act_array_t threads;               //! 一个数组,用来记录当前任务下的所有线程。mach_msg_type_number_t threadCount = 0;   //! 一个数,该参数用来记录线程的个数。const task_t thisTask = mach_task_self(); //! 获取当前任务的task

然后,通过thisTask,获取对应的threads信息以及threadCount

 kern_return_t kr = task_threads(thisTask, &threads, &threadCount); //! 通过thisTask,获取threads以及threadCount。

同时,检查是否获取成功,KERN_SUCCESS = 0代表成功,其他有对应的错误码有52种。

 if (kr != KERN_SUCCESS) { //! 检查是否成功,KERN_SUCCESS = 0 代表成功,其他有对应的错误码有52种。return;}

最后,遍历当前任务内所有存活的线程,查看每条线程的信息。每当有线程的CPU使用率(cpu_usage)超过指定阈值,就将当前线程的调用堆栈存入数据库。

//! 遍历当前任务内存活的所有线程for (int i = 0; i < threadCount; i++) {thread_info_data_t threadInfo; // 32位datathread_basic_info_t threadBaseInfo;mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX;if (thread_info((thread_act_t)threads[i], THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount) == KERN_SUCCESS) {threadBaseInfo = (thread_basic_info_t)threadInfo; // 获取线程的信息if (!(threadBaseInfo->flags & TH_FLAGS_IDLE)) {integer_t cpuUsage = threadBaseInfo->cpu_usage / 10; // CPU最大usage为1000,因此除10即可获得CPU当前的利用率。if (cpuUsage > CPUMONITORRATE) { // 超过设定的阈值时,记录堆栈//cup 消耗大于设置值时打印和记录堆栈NSString *reStr = qiStackOfThread(threads[i]);QiCallStackModel *model = [[QiCallStackModel alloc] init];model.stackStr = reStr;//记录数据库中[[[QiLagDB shareInstance] increaseWithStackModel:model] subscribeNext:^(id x) {}];NSLog(@"CPU useage overload thread stack:\n%@",reStr);}}}}

为了监控的同时,又不影响App性能,故这个判断用一个定时器,每3秒刷新一次即可。

 //! 监测 CPU 消耗self.cpuMonitorTimer = [NSTimer scheduledTimerWithTimeInterval:3target:selfselector:@selector(updateCPUInfo)userInfo:nilrepeats:YES];

源码

QiLagMonitor

_

_

_

_

360技术公众号

技术干货|一手资讯|精彩活动

iOS 性能监控(一)—— CPU功耗监控相关推荐

  1. AIDA64如何设置小屏监控 AIDA64监控CPU功耗

    品牌型号:Dell Vostro 15 7510 系统:Windows 10 家庭版 软件版本:AIDA64 6.50.5800 部分用户可能电脑型号不一样,但系统版本一致都适合该方法. 对于很多硬件 ...

  2. linux系统和性能监控之cpu篇,Linux系统和性能监控之CPU篇

    1.0 性能监控介绍 性能优化就是找到系统处理中的瓶颈以及去除这些的过程,多数管理员相信看一些相关的"cook book"就可以实现性能优化,通常通过对内核的一些配置是可以简单的解 ...

  3. linux进程cpu时间片,Linux性能监控之CPU篇

    这篇文章中,主要介绍CPU的一些基础知识. 首先介绍一下Linux kernel中的调度器(scheduler),调度器负责调度系统中的两种资源,一是线程,二是中断.调度器给不同资源不同的优先级.从高 ...

  4. Linux性能监控(CPU监控)

    Linux性能监控(CPU监控) 主要分为四类: cup监控 内存监控命令 IO性能 网络性能 cup监控 关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run ...

  5. 【iOS开发】页面卡顿监控和优化

    转载地址:卡顿 卡顿的原因: 由上面屏幕显示的原理,采用了垂直同步机制的手机设备.如果在一个VSync 时间内,CPU 或GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示 ...

  6. 剖析CPU温度监控技术

    迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的"芯",往往会在几秒钟内永远停止"跳动".值得庆幸的是,聪明的工程师们开发出有效的CPU温 ...

  7. CPU温度监控常见问题

    设备的性能取决于其CPU的状况:没有CPU,设备将无法正常运行.跟踪 CPU 运行状况指标至关重要,尤其是 CPU 温度,如果 CPU 过热,系统可能会滞后或崩溃. 是什么导致 CPU 温度升高 计算 ...

  8. cpu频率监控linux系统,一种用于Linux的CPU压力测试监控方法与流程

    本发明涉及的是服务器领域,尤其是在Linux下对CPU压力测试时,进行CPU监控的方法. 背景技术: 在现有技术中,公知的技术是CPU作为现代服务器的核心组成部分,其稳定性直接影响整个服务器的稳定性. ...

  9. 全面剖析CPU温度监控技术

    迄今为止还没有一种CPU散热系统能保证永不失效.失去了散热系统保护伞的"芯",往往会在几秒钟内永远停止"跳动".值得庆幸的是,聪明的工程师们早已开发出有效的处理 ...

最新文章

  1. iframe中的奇怪现象
  2. cf1051F. The Shortest Statement(最短路)
  3. mysql 测试与mongodb 测试对比
  4. SUSE各个系统版本安装saltstack方法
  5. SQL Server 2008如何导出带数据的脚本文件
  6. 从零开始学习jQuery (九) jQuery工具函数 【转】
  7. DotNetCore跨平台~配置文件与配置代码如何共存
  8. 抖音申请企业蓝v认证的流程是怎样的?
  9. LInux下如何挂载光盘找rpm包?
  10. 项目实习——《图书管理系统》需求分析
  11. 去掉WPS智能生成目录中的空白行
  12. 360打开html加载不出来,360浏览器显示正在解析主机打不开网页如何处理
  13. 2022年甘肃省安全员B证判断题及在线模拟考试
  14. CA证书出错,请登录微信支付商户平台下载证书
  15. JAVA基础七 类和对象
  16. 售后返修管理软件流程设计图
  17. 五千年中国富豪排行榜(组图)
  18. 实现财务自由的重要工具
  19. oracle为表空间增加数据文件,创建Oracle表空间,增加数据文件的步骤
  20. 使用在线UML制作工具Freedgo Design设计uml例子

热门文章

  1. vlookup使用步骤_Excel Vlookup函数的使用方法及实例图解
  2. html —— table 标签 与 display:table 样式
  3. SMB服务搭建与访问
  4. Java语言程序设计基础篇(第十版 梁勇著)课后习题答案 - 第二章
  5. Filament 渲染引擎剖析 之 多线程渲染 2
  6. matlab numel x,试图访问 x(2);由于 numel(x)=1,索引超出范围。
  7. office2010打开excel文档时为空白的解决方法
  8. Qt去除libpng warning: iCCP: known incorrect sRGB profile警告
  9. 信仰:生或者死——读海子、史铁生
  10. Linux下Graphite的安装及部署