【译文】重新评估性能测试:基准测试需要注意的几个点

简介: > 本文是对 Brendan Gregg [Evaluating the Evaluation: A Benchmarking Checklist](http://www.brendangregg.com/blog/2018-06-30/benchmarking-checklist.html) 一文的翻译。 一位同事向我介绍了 Craig Hanson 与 Pat Crain 关于性能分

本文是对 Brendan Gregg Evaluating the Evaluation: A Benchmarking Checklist 一文的翻译。

一位同事向我介绍了 Craig Hanson 与 Pat Crain 关于性能分析的几条箴言,这些箴言巧妙地总结了我们在性能分析和调优方面所做的大部分工作。

性能箴言

这些箴言分别是:

Don't do it
Do it, but don't do it again
Do it less
Do it later
Do it when they're not looking
Do it concurrently
Do it cheaper

这些箴言启发了我关注性能分析的另一面,即评估基准测试(benchmark)的正确性。正确的性能基准测试有助于提升项目的性能,然而不幸的是,错误的基准测试则更为常见。

我职业生涯的大部分时间都致力于正确的性能基准测试,以至于我的前雇主做的基准测试,通常在得到我的认可之后才会被最终发布。性能基准测试的正确性是如此的重要,因而我想与大家分享我是怎么确保这一点的。

或许你正在根据你需要的基准测试寻找一款符合要求的性能测试平台,抑或是你自己正在开发一款新的性能测试平台以执行相应的基准测试,无论如何,我都推荐你使用以下几个问题作为评估基准测试的清单:

Why not double?
Did it break limits?
Did it error?
Does it reproduce?
Does it matter?
Did it even happen?

基准测试评估清单

1. 为什么不能翻倍?(Why not double?)

如果你执行的一项基准测试的结果是 20k ops/sec,那么你应该问:为什么不能是 40k ops/sec?这实际上是在问:这一性能指标的限制因素是什么?区别是,前一种问法会鼓励人们去回答这一问题,而后者则更像是一个学术议题的家庭作业。在回答“为什么不能翻倍?”这个问题的过程中,人们会去找到并修复这一指标的限制因素,并最终使这一项性能指标翻倍。对于这一问题的回答,实际上还需要在基准测试的运行过程中使用其他一些可视化的工具对测试的过程进行分析(这一过程我称之为“积极的基准测试”(active benchmarking))。

2. 是否违背外部因素的限制?(Did it break limits?)

这实际上是检查你做的基准测试是否合理。我看到很多基准测试的结果实际上极大地违背了网络带宽的物理限制(其违背的程度甚至达到了10倍的网络带宽)。网络、PCIe 总线、CPU 互连总线、内存总线、以及存储设备(无论是IO通量还是IOPS),这些在性能上都存在物理限制,其中网络是最易察觉的。在某些情况下,(一项测试本机与远端数据通信性能的)基准测试的结果可能会超过网络带宽的上限,因为这些基准测试是从本地的内存缓存中读取数据,而不是远端服务器。如果你要测试,在固定数据包大小的情况下数据的传输速率,你可以先估算测试需要的最小数据通量,然后与网络链路的带宽进行比较。

3. 测试过程中有发生异常吗?(Did it error?)

测试过程中异常行为的占比是多少?0%,1%,还是 100%?基准测试的配置可能在一开始就是错误的,或者在压力测试中系统更容易发生异常行为。异常行为有别于普通的正常行为,因而异常行为的百分比很高时,测试结果的可信度就会大打折扣。如果你查看测试结果的习惯是,在冗长的测试报告中只关注数据的通量与延时,或者是使用 shell 脚本解析其中的某些指标,那么你就很容易缺失测试报告中的很多信息,例如异常行为的百分比。

4. 会复现吗?(Does it reproduce?)

如果同一个基准测试重复运行 10 次,那么测试结果的一致性如何?有很多因素(例如缓存、turbo boost 技术等),甚至是一些轻微的变化(例如系统的 cron 任务、垃圾回收等),都会导致单次测试结果的扰动。感知系统方面细微变化的一种方法是使用系统的 load 指标:在 load 指标变为 "0.00, 0.00, 0.00" 之后再开始你的基准测试。如果这一指标迟迟不能达到 “0.00, 0.00, 0.00”,那么你就需要进行 debug,找到其中的原因并解决掉。

5. 这真的重要吗?(Does it matter?)

如果我告诉你一辆汽车的时速达到 7000 mph 时它的轮子会脱离车体,而另一辆汽车的时速达到 9000 mph 时才会这样,那么这个因素会影响你的购买决策吗?并不大会。但是我却看到很多性能测试的平台,会以一种现实中并不会有的强度对某个系统组件进行测试,只是为了在数据上打败竞争对手。很多傻瓜式的测试平台基本上全是这样,这其实充满了误导性。因而你需要问你自己:这项基准测试在现实生活中真的重要吗?

6. 这真的发生过吗?(Did it even happen?)

曾经有一位客户反馈,某项基准测试测到的延时不可思议的高:每个请求的延时都达到了 1s。我的同事开始使用数据包探测工具对客户使用的机器进行检查,以验证服务器发出的数据包是否真的花了那么长的时间才到达客户的机器。结果我的同事没有看到任何的数据包!客户机器上的防火墙隔绝了一切——而测试报告中的延时只是测试软件的超时时长。因而警惕那些在基准测试实际并没有运行的情况下,由于错误配置而导致测试软件返回错误结果的情况。

我希望以上这些方法论能对你有所帮助,同时也欢迎转发给其他任何需要执行或评估基准测试的人。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
2月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
2月前
|
安全 测试技术
BOSHIDA DC电源模块的安全性能评估与测试方法
BOSHIDA DC电源模块的安全性能评估与测试方法
 BOSHIDA DC电源模块的安全性能评估与测试方法
|
2月前
|
安全
DC电源模块的安全性能评估与测试方法
DC电源模块的安全性能评估与测试方法 DC电源模块的安全性能评估与测试方法应包括以下几个方面: 1. 输入安全性测试:包括输入电压范围、输入电压稳定性、输入电流范围、输入电流保护等方面的测试。测试方法可以是逐步增加输入电压或输入电流,观察模块的工作状态和保护功能。
DC电源模块的安全性能评估与测试方法
|
4月前
|
测试技术
性能测试和负载测试的区别
性能测试和负载测试的区别
|
4月前
|
机器学习/深度学习 搜索推荐 算法
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
201 0
|
3天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
9 1
|
4天前
|
存储 大数据 测试技术
矢量数据库的性能测试与评估方法
【4月更文挑战第30天】本文探讨了矢量数据库的性能测试与评估方法,强调其在大数据和AI时代的重要性。文中介绍了负载测试、压力测试、容量测试、功能测试和稳定性测试五大评估方法,以及实施步骤,包括确定测试目标、设计用例、准备环境、执行测试和分析结果。这些方法有助于确保数据库的稳定性和高效性,推动技术发展。
|
10天前
|
人工智能 监控 数据处理
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】1. 快速上手数据集与测试评估过程
31 0
|
26天前
|
人工智能 分布式计算 Kubernetes
人工智能,应该如何测试?(三)数据构造与性能测试篇
本文探讨了人工智能场景中的性能测试,区别于传统互联网测试,其复杂性更高。主要关注点包括两类AI产品——业务类和平台类,后者涉及AI全生命周期,测试难度更大。测试重点是模型训练的性能,特别是数据模拟。需要构造大量结构化数据,如不同规模、分布、分片和特征规模的数据,以评估算法效率。此外,还涉及模拟设备规模(如视频流)和节点规模(边缘计算),以测试在大规模负载下的系统性能。文中提到了使用工具如Spark、ffmpeg、流媒体服务器和Kubernetes(K8S)的扩展项目,如Kubemark,来模拟大规模环境。最后,文章介绍了使用Golang进行异步IO操作以构建海量小文件,优化IO性能。
48 0
|
2月前
|
运维 监控 安全
【软件设计师备考 专题 】可靠性测试和可靠性评估
【软件设计师备考 专题 】可靠性测试和可靠性评估
55 0

热门文章

最新文章