目录
除了拓扑的自动构建外,代码级分析能力也是非常重要的能力。链路拓扑可以帮助性能测试工程师快速定位哪个实例出现异常,而代码级分析则更进一步。链路拓扑展示一个请求链路中单个实例的方法执行逻辑、执行耗时及可能的异常信息,赋予测试工程师代码级分析能力。根据所展示的数据,性能测试工程师可以针对以下几个方面进行深入分析。
调用耗时分析
调用耗时是代码级分析能力中比较核心的部分,系统展示当前请求在此实例中执行所用方法的详情,包括方法名和耗时信息。其中,方法名主要指当前调用过的每个方法的名,一般也会包括其参数信息,方便测试工程师判断异常点在哪段代码中。耗时信息指当前方法完成执行的时间。
性能优化是一个重要的方面,而对代码进行耗时分析(也称为性能剖析或profiling)是识别瓶颈并提高程序效率的关键步骤。下面我将给出一个简单的Python示例来演示如何使用cProfile模块来进行耗时分析。
cProfile是Python的一个内置性能分析工具,它可以帮助开发者了解程序运行时各个部分的执行时间和调用次数等信息。这里提供一个简单的例子来展示如何使用cProfile进行函数的耗时分析。
示例代码
首先,我们创建一个简单的脚本,其中包含一些可以测量执行时间的函数。
import time
import random
def slow_function():
print("开始执行慢速函数...")
time.sleep(random.randint(5, 8)) # 模拟耗时操作
print("慢速函数执行完毕。")
def fast_function():
print("快速函数执行中...")
time.sleep(random.randint(1, 6)/10) # 模拟较快的操作
print("快速函数执行完毕。")
def main():
print("主程序开始执行...")
slow_function()
for _ in range(1):
fast_function()
print("主程序执行结束。")
if __name__ == "__main__":
main()
if __name__ == "__main__":
import cProfile
cProfile.run('main()', sort='cumulative')
这里的-s cumtime
或sort='cumulative'
参数表示按照累计时间排序输出结果,这样可以看到哪些函数占用的时间最多。
运行结果如下图:
分析报告
运行上述命令后,您将看到类似这样的输出,其中包括每个函数被调用了多少次、总共花费了多少时间以及每次调用平均花费的时间等信息,这些数据对于找出性能瓶颈非常有用。
在上图中,action=zpblog&appname=pcsearch&sid=xxxxxx即为当前实例中处理用户请求的接口。其耗时为225毫秒表示当前接口耗时225毫秒即可完成处理。
当然,各个分析平台的实现方式可能不同,但是实现逻辑是一致的,系统通过可视化的视图、颜色和数字,让测试工程师能快速了解测试请求经过了多少方法,每个方法的耗时多久。如果出现耗时较长的方法,测试工程师可快速将实例名称、IP、方法名、耗时等信息传递给分析人员或开发工程师,他们基于压测数据和调用耗时数据可明确问题分析的方向。
SQL分析
在常规系统中存在大量的SQL调用,这些SQL调用也可能成为性能瓶颈,因此对于SQL句的分析至关重要。
分析平台会自动捕获调用中涉及的SQL语句及其耗时,针对每个SQL调用均会采集并展示完整的SQL句,包括查询参数等。若测试工程师发现性能瓶颈在S0L调用,如常见的select*或者大量的where语句等则可以将完整SQL语句复制并提交给开发工程师或DBA(数据库管理员),进行问题意见及排查。
SOL相关的性能问题不仅仅是语句书写有问题,连接池配置不合理也会导致SQL语句执行时间较长,这种情况常表现为有大量耗时出现在数据库gelConnection方法中,如果数据库连接池配置不恰当,就会出现大量的数据库连接的类似性能问题。
异常分析
不管是新业务上线阶段还是回归阶段,日常压测过程中被测应用均可能出现异常,但是在传统测试方法实施时基本没有异常数据分析工具,仅通过失败率和HTTP状态码进行异常判断,如果需要了解异常详细信息则需开发方介入。同时由于异常的信息少、部分场景无法进行复现,开发方也很难快速进行定位,测试工程师和开发工程师需要大量沟通,影响性能测试调优过程,影响性能测试进度。
因此针对异常的分析和异常现场数据的保留也是重要的两个能力。导常分析主要包括在代码执行过程中出现的各种异常,如常见的空指针异常、数组越界异常、数据库相关异常等。这些异常在实际压测过程中均会导致成功率大幅度下降,这类问题是需要第一时间发现并解决的,异常数据保留则关注异常类型,出现异常的代码、使用框架。所属应用、请求协议、线程名称,线程栈等信息,测试工程师能通过分析平台将异常出现的现场尽可能保留下来,交给开发工程师进行分析和修复。
日志分析
日志分析是目前常用的手段,当出现异常时,测试工程师也会登录被测应用所在服务器,通过时间,被测接口等信息在海量日志中进行分析,其排查效率较低。由于日志量较大,即使通过压测时间段进行筛选,其数据依然很多,测试工程师无法准确判断输出的日志是否为本次压测场景产生的,也可能是其他误操作导致的日志报错。因此基于链路的日志分析功能也应运而生。
前文提到过,链路分析基于探针和字节码增强技术实现,能对常用组件进行动态插桩。在日志分析场景下,探针会对常用的日志框架进行插桩,从而在代码出现报错时自动获取其相关的日志输出,展示在平台中。这具备如下两个优势:
同一平台既能查看链路、代码级数据,又能进行日志分析,两大数据相辅相成,能更快地定位性能瓶颈。
实现了请求与日志的绑定,每次请求生成的日志都会被独立展示,减少了其他请求触发的误导信息。
阅读后若有收获,你的关注,点赞,转发,留言评论等是对我最大支持!!!
标签:分析,调用,工程师,性能,耗时,应用,SQL,测试代码,日志 From: https://blog.csdn.net/qd_lifeng/article/details/143731744