#Q某测试群问题讨论有感而发#
前言背景
于Q某测试群群友发来数据可视化检测,并提出基于Peometheus普罗米修斯数据采集工具的关于本地Windows系统计算机CPU使用率统计于任务管理器CPU使用率统计相差10倍之多而来的疑惑,特此引发讨论,本篇给出具体答案和探讨方法,上篇简介数据可视化监控平台的搭建,链接: https://blog.csdn.net/qq_21794989/article/details/136468849 。
注:本系列赞以Windows系统为例书写。
结论:Prometheus统计算法不同针对的结果不同,要考虑CPU多核问题+选取合理CPU算法+合理选择统计参照对象。
问题详情
节省时间,直接上图:
prometheus 自带CPU使用率公式计算的和任务管理器的结果怎么有10倍的差距
问题结果 & 探讨过程
结果
为节省时间此处先给出结果,再讨论具体原因和探讨方法。结果如下图:
1. Prometheus采集的目标进程如图
2. 统计CPU使用率时间区间
3. 大致对应的Prometheus统计数据图
由图一到图三,依次由系统CPU使用率统计到Prometheus工具采集CPU使用率计算得知,系统CPU统计的是区间1分钟内的平均CPU使用率(CPU使用率 / CPU核数),因此通过计算可与Prometheus统计工具基本吻合。
探讨过程
细心朋友发现两种统计工具差距不小,经过相关资料查询和反复验证,找到原因主要分为以下两点:
1. WindowsCPU使用率计算与Prometheus在算法上的差异;
2. Prometheus采集数据以及公式运用的函数差异。
Windows 相关
Windows系统计算CPU相关资料,如下图:
1. WindowsCPU总利用率算法
2. WindowsCPU计算算法代码
Prometheus 相关
1. 首先了解几个常用也容混淆的函数:rate()、irate()、increase()、Couter类型数据。
rate 函数
rate(v range-vector)计算范围向量中时间序列的每秒平均增长率。
irate 函数
irate(v range-vector)计算范围向量中时间序列的每秒瞬时增长率。
increase 函数
increase(v range-vector)计算范围向量中时间序列的增加。
Counter 数据
简单理解为一个游标类型的数据,它是一个不断增长的量,计算从服务或者设备启动到终止服务或关机的时间向量。
2. 再了解Prometheus统计CPU的常用算法方式
CPU使用率概念
CPU使用率 = CPU非空闲时间 / CPU总时间
网上常用计算公式
100
*
avg by (instance) (irate(windows_cpu_time_total{job="prometheus2",mode="idle"}[5m]))
100 -
(
sum by (instance) (increase(windows_cpu_time_total{mode="idle"}[5m]))
/
sum by (instance) (increase(windows_cpu_time_total[5m]))
)
*
100
实际对比
由上图可看出实际使用irate方式统计明显不正确,不符合与Windows的统计参照,同样根据概念也应仅仅使用increase()函数统计而不应使用rate()和irate()函数。
特此声明:irate、rate、increase函数各有用处和优点,此也并非一定参展WindowsCPU使用率统计为基准而去讨论或者抨击PrometheusCPU的统计方法,仅仅由实际问题出发,疑问导向结果,请朋友们勿以偏概全同时也并非本文的目的!!!
群友讨论 & 探讨方法
群友讨论
如下图简单所示群内讨论流程和大致内容:
1. 一开始就有人猜测多核问题
2. 讨论函数的相关应用
误区
一开始我也没能准确理解群友的问题,但是有人回答了可能是多核问题。一开始群友使用的是rate函数方式计算CPU使用率,不太准确但也大差不差只是没有increase函数计算的更为标准。后来有人建议计算CPU使用率还是使用increase函数,于是就有了上步图二的方式了。
经过一番探讨发现,群友一开始问题确实是多核问题,但也不仅如此实际并不清楚其根本原因。主要有以下三个方面:
CPU使用率的算法
一开始群友使用算法是不规范的使用了irate函数结合avg平均计算CPU使用率,应该使用increase函数计算更为准确。
不同工具统计的误差
Prometheus和Windows任务管理器对CPU使用率的算法稍有差异,根据资料查询主要差异在idle空闲模式和用户模式的统计上了。
对比参照不正确
Prometheus统计的是配置文件相应端口的服务的相关数据:CPU、内存、硬盘IO等。而实际则跟Windows的任务管理器(统计所有进程的数据)去对比了。应该与资源管理内的特定的进程对比。
结论
群友问题是一个包含了CPU使用率概念、算法、CPU多核问题等综合性问题,看似简单实则经得住推敲和反复数据测试。回顾一开始的疑问:【prometheus 自带CPU使用率公式计算的和任务管理器的结果怎么有10倍的差距】,Prometheus统计的是CPU的平均使用率,其CPU为i513代共14个内核(6个性能8个能效),正好相差十几倍,但是一定要注意其对比的应该是资源管理器中的对应端口服务的数据而不是全部(截图是全部的对应,正好是误打误撞的数据)。
知道未必懂,经常思考和反省。学习是一个反复的过程,工作是学习的实践也是深度学习的导航。