一、效果图
二、实现步骤:绘制软件性能曲线(以load为例)
1.准备测试脚本
GUI操作脚本
2.提取关键性能分析点
1.what?
-
load负载值
-
load average:系统平均负载是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。这个数字越小越好。
-
负载高、使用率低
-
利用率高、负载低
-
说明等待执行的任务很多。很可能是进程僵死了。通过命令 ps -aux 查看是否存在D状态的进程,该状态为不可中断的睡眠状,态。处于D状态的进程通常是在等待IO,通常是IO密集型任务,如果大量请求都集中于相同的IO设备,超出设备的响应能力,会造成任务在运行队列里堆积等待,也就是D状态的进程堆积,那么此时Load Average就会飙高。
-
说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。这种场景,通常是计算密集型任务,即大量生成耗时短的计算任务。
-
-
使用率低、负载低、IOPS 高
-
通常是低频大文件读写,由于请求数量不大,所以任务都处于R状态(表示正在运行,或者处于运行队列,可以被调度运行),负载数值反映了当前运行的任务数,不会飙升,IO设备处于满负荷工作状态,导致系统响应能力降低。
-
-
2.when?
-
软件运行时,各种操作、等待页面时,提取load
3.where?
-
linux环境下的GUI软件
4.why?
-
当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化。 当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来。 当系统负荷达到5.0,就表明你的系统有很严重的问题,长时间没有响应,或者接近死机了。你不应该让系统达到这个值。
-
以上指标都是基于单CPU的,但是现在很多电脑都是多核的。所以,对一般的系统来说,是根据cpu数量去判断系统是否已经过载(Over Load)的。如果我们认为0.7算是单核机器负载的安全线的话,那么四核机器的负载最好保持在3(4*0.7 = 2.8)以下。
-
还有一点需要提一下,在Load Avg的指标中,有三个值,1分钟系统负荷、5分钟系统负荷,15分钟系统负荷。我们在排查问题的时候也是可以参考这三个值的。
-
一般情况下,1分钟系统负荷表示最近的暂时现象。15分钟系统负荷表示是持续现象,并非暂时问题。如果load15较高,而load1较低,可以认为情况有所好转。反之,情况可能在恶化。
5.who?
-
单用户
3.log管理
记录load 1值
-
test.log
记录测试操作步骤
-
atp.log
4.matplot下性能曲线绘制
1)x轴
-
时间戳
2)y轴
-
load1值
3)折线*1
-
时间戳-load1折线图
4)散点图*1
-
测试操作散点图
5)水平线*2
-
负载区间
三、文件目录
四、文件详情
1)软件自动化测试脚本log:atp.log
2022_04_22_10_36_37_607;click, 0.85, 0.68
2022_04_22_10_37_26_919;sta1, 0.89, 0.70
2022_04_22_10_39_22_940;click, 0.95, 0.75
2022_04_22_10_39_23_150;sta1:卡死, 0.95, 0.75
2022_04_22_10_39_23_360;sta2:闪退, 0.95, 0.75
2)test.log3)
2022_04_22_10_36_37_607;0.92, 0.85, 0.68
2022_04_22_10_37_26_919;1.21, 0.89, 0.70
2022_04_22_10_39_22_940;0.97, 0.95, 0.75
2022_04_22_10_39_23_150;0.97, 0.95, 0.75
2022_04_22_10_39_23_360;0.28, 0.95, 0.75
3)绘制程序
import time as t
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
import cv2
# matplotlib 中文转义
plt.rcParams['font.sans-serif'] = ['SimHei']
def curve_plot(name1,name2):
t_start = 2022_04_22_10_37_26_919
t_end = 2022_04_22_10_39_22_940
lines = open(name1, encoding='utf-8').readlines()
lines2 = open(name2, encoding='utf-8').readlines()
xlist,timelist,txt1list,y1list=[],[],[],[]
for line in lines2:
if len(line) != 1:
time,txt = line.strip().split(';')
txt1,txt2,txt3 = txt.split(',')
for lineq in lines:
if len(lineq)!= 1: #如果不为空
x,y = lineq .strip().split(';')
y1, y2, y3 = y.split(',')
y1 = float(y1)
if x == time:
xlist.append(x)
timelist.append(time)
txt1list.append(txt1)
y1list.append(y1)
#绘制
plt.plot(xlist, y1list,color='g') #
plt.xticks(rotation=10) # 旋转x度
plt.scatter(xlist, y1list, marker='o')
for i in range(len(xlist)):
plt.annotate(txt1list[i], xy=(xlist[i], y1list[i]), xytext=(xlist[i], y1list[i])) # 这里xy是需要标记的坐标,xytext是对应的标签坐标
plt.hlines(0.7, xmin=0, xmax=10, ls='--', color='royalblue', label='normal')
plt.hlines(1.0, xmin=0, xmax=10, ls='--', color='orange', label='alarm')
plt.show()
curve_plot('test.log','atp.log')