APM系列之三-原理篇-进程CPU峰值采集

前言

本篇是APM系列文章的第三篇,主要介绍如何通过一个第三方应用,去监控整个系统中所有应用进程的CPU占用,线程数量等信息,从而辅助排查问题。

文章开始之前,抛出2个问题:

1.为什么要进行采集CPU峰值?

2.直接使用TOP命令采集不可以吗?

第一个问题,采集应用的CPU峰值,可以辅助我们排查ANR问题,以及检测各个应用之间资源抢占的问题。

第二个问题,为什么不用TOP?为什么TOP采集的是瞬时值,比如0.01S的时间内突然CPU占用率很高,恰好又被TOP命令采集到,这种其实是不影响使用的,也不是问题,而使用TOP其实就存在这样的问题(TOP采集的是0.005S范围内的)。

其实这里还有第三个优势,那就是在APM中进行CPU采集,不依赖外部自动化框架,甚至可以应用于生产环境,要远比使用自动化测试框架执行脚本方便的多。

一.如何采集系统的CPU占用

了解如何采集系统CPU负载之前,我们需要先了解一下Linux的一个知识点。Linux中,内核层的进程相关的一些参数,会映射到外部文件上,其实就包括CPU。

CPU的信息就在stat中,相关的信息如下:

cpu  68724093 7457530 63397397 925179093 133980 12530536 5032898 0 0 0
cpu0 10112649 219978 5476279 162917877 56663 902499 71777 0 0 0
cpu1 6708277 290737 10433269 152733544 20066 5946336 4106893 0 0 0
cpu2 7910158 363569 7767095 162047420 21765 1395025 165457 0 0 0
cpu3 7764109 362644 7439487 161488289 24479 2588136 188684 0 0 0
cpu4 18176591 3311604 16252285 142544691 5175 853398 313223 0 0 0
cpu5 18052306 2908995 16028979 143447269 5829 845139 186861 0 0 0
intr 9609584710 0 0 0 2763090998 0 240905789 7 113975428 88 321676 0 0 0 266 18095257 0 128 170362452 0 0 0 585219272 434 0 0 33 0 0 100 0 0 0 0 0 40580 11321182 32310 30406 45 7 1 291167 30377 77009 30399 2 2511542 31631 0 0 0 0 0 0 0 0 0 0 0 0 113969235 104206676 6 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 2 0 0 0 0 0 0 0 26050299 42922 0 0 0 0 2 0 0 0 20403273 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12661077
ctxt 18927154346
btime 1697697895
processes 6541854
procs_running 1
procs_blocked 0
softirq 2632078945 756013040 411005607 55 251933491 0 0 20403721 422860516 0 769862515

第一行cpu自然自然指的是CPU的总体负载;

第2到7行指的是每个CPU的负载。

第10行btime指的是系统启动时间。

我们的关注点,自然是cpu的相关内容。

解释

0

cpu

cpu名

1

68724093

用户态占用的CPU时间片数量

2

7457530

3

63397397

内核态占用的CPU时间片数量

4

925179093

空闲的cpu时间片

5

133980

IO等待占用的CPU时间片数量

对于CPU来说,一秒有10个时间片,占用10个时间片就意味着占用一个CPU核1秒时间。

采集一段时间的CPU占用率,使用结束时的值减去初始值即可。

二.如何采集应用的CPU占用

同第一章一样,每个进程的相关信息,其实也被映射到proc文件夹下,如果想采集CPU的信息,则其文件位置为:proc/进程ID/stat

其内容如下:

27005 (chs.scenemanage) S 364 364 0 0 -1 1077952832 904400 31987 243 1 6046993 2110950 404 90 20 0 113 0 18317266 43353554944 87520 18446744073709551615 369542340608 369542358060 549678426064 0 0 0 4612 1 1073775864 0 0 0 17 5 0 0 0 0 0 369542470240 369542471680 370186252288 549678426720 549678426819 549678426819 549678428126 0

每个字段的含义:

第几列

名称

英文名

实例值

解释

0

进程PID

pid

27005

进程ID (pid)

1

进程名称

comm

chs.scenemanage

进程名,这里的进程名被截取了并不是完整的。

2

状态

state

S

R:运行, S:休眠, D:等待IO, T: 暂停, T:停止,Z:僵尸进程, X:死亡

3

父进程ID

ppid

364

4

进程组ID

pgrp

364

该任务所在的会话组ID

5

会话ID

session

0

6

控制终端

tty_nr

0

该任务的tty终端的设备号,INT(0/256)=主设备号,(0-主设备号)=次设备号

7

控制进程组

tpgid

-1

终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。

8

内核调度优先级

flags

1077952832

进程标志位,查看该任务的特性。

9

拷贝次数

min_flt

904400

该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数。

10

缺页的次数目

cmin_flt

31987

累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目。

11

主缺页次数

maj_flt

243

该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数。

12

缺页次数

cmaj_flt

1

累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目。

13

用户模式时间

utime

6046993

14

内核模式时间

stime

2110950

15

等待子进程的用户模式时间

cutime

404

16

等待子进程的内核模式时间

cstime

90

17

优先级

priority

20

18

nice 值

nice

0

19

线程数

num_threads

113

20

无用字段

itrealvalue

0

21

启动时间

starttime

18317266

单位毫秒

22

虚拟内存大小

vsize

43353554944

23

物理内存大小

rrs

87520

后面的简略

所以求一个进程在一个时间段的CPU占用率,只要拿结束时的CPU时间片数量,减掉开始时的时间片数量,即可得到这段时间内占用的CPU时间片数量。除以总的时间片数量,得到的就是CPU占用率。

三.存在的问题

按照第一章和第二章的结论,我们可以确实可以计算出一段时间内安卓系统和某个应用的CPU占用率,甚至还可以得到进程中的线程数量。

但是实际操作的过程中,也遇到一些问题。

问题1:proc/进程ID/stat文件无权限阅读

虽然其权限值为-r--r--r--。关掉SELinux就正常的,所以最后通过配置SELinux的白名单解决。

问题2:报错FileNotFoundException

报错内容如下:

11-02 13:48:04.658 27807 27879 W System.err: java.io.FileNotFoundException: proc/10796/stat (No such file or directory)
11-02 13:48:04.659 27807 27879 W System.err:  at java.io.FileInputStream.open0(Native Method)
11-02 13:48:04.659 27807 27879 W System.err:  at java.io.FileInputStream.open(FileInputStream.java:231)
11-02 13:48:04.659 27807 27879 W System.err:  at java.io.FileInputStream.<i nit>(FileInputStream.java:165)
11-02 13:48:04.659 27807 27879 W System.err:  at com.xxxx.apmcommon.IOHelper.fromFileToIputStream(IOHelper.java:210)
11-02 13:48:04.659 27807 27879 W System.err:  at com.xxxx.apmcommon.IOHelper.readFile(IOHelper.java:36)
11-02 13:48:04.659 27807 27879 W System.err:  at com.xxxx.util.WatchUtils$Companion.readStatByPid2(WatchUtils.kt:90)
11-02 13:48:04.659 27807 27879 W System.err:  at com.xxxx.watch.watchcpu.CpuPresenter.startReadAppCpu(CpuPresenter.kt:30)
11-02 13:48:04.659 27807 27879 W System.err:  at com.xxxx.watch.watchcpu.GetTopBroadcast$GetTopRunnable.run(GetTopBroadcast.kt:87)
11-02 13:48:04.659 27807 27879 W System.err:  at android.os.Handler.handleCallback(Handler.java:873)
11-02 13:48:04.659 27807 27879 W System.err:  at android.os.Handler.dispatchMessage(Handler.java:99)
11-02 13:48:04.659 27807 27879 W System.err:  at android.os.Looper.loop(Looper.java:193)
11-02 13:48:04.659 27807 27879 W System.err:  at android.os.HandlerThread.run(HandlerThread.java:65)

即使关掉了SELinux,某些进程仍然会提示这样的错误,说明和SELinux无关。而实际上,这个文件是存在的。

这个问题到目前为止仍然没有解决,由于是某些极个别的设备上的问题,不影响使用,所以就暂且搁置这个问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/143111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8-Seg改进:分割注意力系列篇 | 上下文增强和特征细化注意力ContextAggregation

🚀🚀🚀本文改进:多头上下文集成(Context Aggregation)的广义构建模块 ,引入YOLOv8二次创新; 🚀🚀🚀Context Aggregation小目标分割&复杂场景首选,实现涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创…

电脑监控软件丨功能详情丨特点分析

电脑监控软件的出现&#xff0c;是在信息技术的飞速发展以及计算机使用的普及的背景下产生的。随着计算机在企业、学校以及家庭等各个场所的广泛使用&#xff0c;管理和保护计算机数据安全的问题变得越来越重要。因此&#xff0c;电脑监控软件应运而生&#xff0c;旨在帮助用户…

YOLOv8-Seg改进:卷积变体系列篇 | DCNv3可形变卷积基于DCNv2优化 | CVPR2023

🚀🚀🚀本文改进:DCNv3算子,基于DCNv2算子引入共享投射权重、多组机制和采样点调制,引入到YOLOv8,与C2f结合实现二次创新; 🚀🚀🚀DCNv3 亲测在多个数据集能够实现涨点,同样适用于小目标分割 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐…

基于springboot实现体育场馆运营平台项目【项目源码】

基于springboot实现体育场馆运营管理系统演示 系统开发平台 在该数码论坛系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其功能…

hadoop 大数据环境配置 ssh免密登录 centos配置免密登录 hadoop(四)

1. 找到.ssh文件夹 cd ~ 2. 生成私钥公钥命令&#xff1a; ssh-keygen -t rsa3. 发送到需要免密机器&#xff1a; # hadoop23 是我做了配置。在host配置得机器ip和名称得映射 ssh-copy-id hadoop23 4. 成功

SpringBoot整合Dubbo和Nacos

1.概述 dubbo是一个高性能、轻量级的开源分布式服务框架&#xff0c;早期由阿里巴巴进行开源。它提供了服务注册、发现、调用和负载均衡等分布式服务治理功能&#xff0c;为分布式开发提供了极大便利。dubbo核心概念包括&#xff1a;Provider&#xff08;消费提供者&#xff0…

【Windows】安装绿色版Mysql数据库 -- 可支持所有版本安装教程

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

化妆品发墨西哥专线的难点解析

化妆品发往墨西哥专线的难点主要包括以下几个方面&#xff1a; 1. 物流监管&#xff1a;墨西哥对化妆品的进口有严格的监管和法规要求&#xff0c;包括产品注册、标签规定、成分审批等。化妆品属于特殊的进口商品&#xff0c;需要满足墨西哥卫生部门(COFEPRIS)的相关规定&#…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

科研绘图与学术图表绘制:从入门到精通

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 一、入门篇 1.1 软件介…

cryptopp Base64Encoder \n问题

1、问题&#xff1a; new Base64Encoder(new StringSink(out_base)) 调用库函数Base64Encoder进行base64加密后确认多出来了\n 2、原因 base64加密的问题, 由于base64一行不能超过76字符, 超过就会添加回车换行符(在Windows中是 \r\n , 在Linux中是 \n ) 3、解决 方法一、给定参…

对这套BI零售数据分析方案心动,是零售人天性

零售数据分析做了这么多年&#xff0c;难道真的没累积点经验&#xff0c;摸索出一条又快又能满足绝大多数需求的数据分析捷径&#xff1f;别人不知道&#xff0c;奥威BI还真就有这么一套标准化的BI零售数据分析方案&#xff0c;不管是服装零售、医药连锁、商超都能利用这套方案…

【JY】ANSYS Workbench在减隔震应用分析中的单元积分技术笔记

写在前文 尽管减隔震技术与有限元结合取得了众多成果&#xff0c;但仍面临诸多挑战&#xff0c;如材料非线性、模型不确定性等等。减隔震设计除了常规的宏观结构设计采用SAP2000、Etabs、Midas、SSG、Paco-SAP 或 YJK\PKPM等。 【JY】各类有限元软件计算功能赏析与探讨 我们需要…

为什么PDF文件不能打印?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

TCP为什么需要三次握手和四次挥手?

面试官&#xff1a;说说TCP为什么需要三次握手和四次挥手&#xff1f; 一、三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、…

新生儿奶瓣:原因、科普和注意事项

引言&#xff1a; 新生儿奶瓣是一种婴儿口腔内的常见现象&#xff0c;它通常被视为正常的生理发展。然而&#xff0c;对于一些新父母而言&#xff0c;了解奶瓣的原因以及如何处理是至关重要的。本文将科普新生儿奶瓣的原因&#xff0c;提供相关信息&#xff0c;并为父母和监护…

Python 如何实现迭代器设计模式?什么是迭代器(Iterator)设计模式?

迭代器&#xff08;Iterator&#xff09;设计模式是一种行为设计模式&#xff0c;用于提供一种方法来访问一个聚合对象中的各个元素&#xff0c;而不暴露该对象的内部表示。它定义了一种迭代的方式&#xff0c;允许客户端按序访问聚合中的元素&#xff0c;而无需了解底层的数据…

4步轻松搞定烦人的WPS右键菜单

安装WPS的时候不小心勾选了很多默认选项&#xff0c;结果右键菜单惨不忍睹&#xff0c;一些没用的菜单占据了大量篇幅&#xff0c;使用起来十分不方便。考虑360&#xff0c;火绒的右键菜单管理功能没搞定&#xff0c;最后在WPS的管理功能的隐藏角落找到了设置功能&#xff0c;给…

模拟实现C语言--strstr函数

模拟实现C语言–strstr函数 文章目录 模拟实现C语言--strstr函数一、strstr函数是什么&#xff1f;二、使用示例三、模拟实现3.1 模拟实现1 一、strstr函数是什么&#xff1f; 在目标字符串中寻找字符串 char * strstr ( const char *str1, const char * str2);根据语法结构&…

Java 反射设置List属性

使用 Java 反射可以动态地设置对象的属性值&#xff0c;包括 List 类型的属性。以下是一个示例代码&#xff0c;演示如何通过反射设置 List 类型的属性&#xff1a; 假设有一个类 Person&#xff0c;包含一个 List 类型的属性 names&#xff1a; java public class Person { …