一、定义
在维基百科上面找到关于Benchmark的解释为:
In computing, a benchmark is the act of running a computer program, a set of programs, or other operations, in order to assess the relative performance of an object, normally by running a number of standard tests and trials against it.
翻译过来就是:在计算中,Benchmark是指运行计算机程序、一组程序或其他操作,以评估对象的相对性能的行为,通常是通过对其进行一些标准测试和试验。
更准确来说:
基准测试(Benchmark)是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。
接下来我们来看如何进行一次Benchmark,首先我们要选定一个测试目标,并且选定数据集和基准模型,最重要的还要选定度量指标。
二、特征
1.测试可重复
2.测试的每次迭代都在相同系统状态下开始
3.系统中不存在任何意外地处于活动状态的其他功能或应用程序
4.用于基准程序测试的硬件和软件与生产环境匹配
三、过程
(1)选定测试目标
比如我们要对一个数据仓库进行测试,通常会包括以下几个方面:
1.读写性能:衡量数据仓库在读取和写入数据方面的性能表现。包括:吞吐量(每秒处理的请求数量)、延迟(请求的响应时间)、并发性(同时处理的请求数量)等。
2.数据一致性:测试数据仓库在分布式环境中的数据一致性保证程度。根据应用场景的不同,对数据强一致性、弱一致性、最终一致性会有不同的侧重。
3.故障恢复和高可用性:测试数据仓库在面对故障时的恢复能力和高可用性。可以模拟节点故障或网络分区等场景,评估数据仓库的故障转移和数据恢复性能。
4.数据安全性:评估数据仓库在数据保护方面的性能。包括:数据的备份和恢复速度、数据加密和访问控制等。
5.集群管理和资源利用率:评估数据仓库在集群管理和资源利用方面的性能。包括:节点的动态扩缩容、负载均衡、资源利用率等。
6.数据库管理工具性能:评估数据仓库管理工具在配置、监控、诊断和优化等方面的性能表现。
再比如我们要对一个机器学习的算法进行测试,通常会包括:
1.准确性:分类准确率:对于分类任务,指的是模型预测正确的样本比例。回归准确率:对于回归任务,指的是模型预测值与真实值之间的差距。
2. 效率:训练时间:指的是模型训练所需的时间。预测时间:指的是模型预测所需的时间。资源消耗:指的是模型训练和预测所需的资源,例如CPU、内存、GPU等。
3. 可解释性:模型可解释性:指的是模型预测结果的可解释程度。
(2)选择数据集
测试集要能够代表真实应用场景中的数据,规模要足够大,数据质量要高,多样性要强,并且容易获得。
(3)选择基准模型
基准模型可以是理论模型,也可以是实际系统。测试模型要能够反映系统的关键性能指标,并且能够与测试系统进行比较。
(4)选择合理的测试工具
还是对上面提到的数据仓库进行Benchmark我们能选取的工具有:
1.Jmeter : JMeter是Apache基金会开源的基于Java实现的压力测试工具,对不同类型的应用/服务等进行性能测试.对性能测试结果提供图形分析功能,对于高负载施压的场景,支持部署分布式环境。
2.Sysbench:Sysbench是一个基于LuaJIT的可自定义脚本的多线程性能测试工具,主要包括CPU、磁盘IO、内存、数据库的性能基准测试。
3.HammerDB:Hammerdb作为一个开源的数据库压力和基准测试工具,有图形用户界面和命令行两种形式。支持标准的TPC-C和TPC-H两种测试模型。TPC-C测试模拟了一个批发商的仓储管理环境
4.SwingBench :SwingBench是基于JAVA开发的Oracle数据库性能基准测试工具,是免费软件。SwingBench生成负载来进行数据库测试,最后生成相关的响应时间、事务数等测试结果图表
(5)收集测试执行结果
其中包括各种性能指标的数据,如响应时间、吞吐量、并发连接数等。使用工具提供的报告功能或自定义脚本来自动化数据收集过程。
(6)分析结果
- 性能评估:可以用来评估系统的性能,包括执行速度、资源利用率、可扩展性和稳定性等。通过分析,可以了解系统的性能瓶颈,并进行优化。
- 产品选型:可以用来比较不同产品的性能和功能,帮助用户选择最适合自己的产品。
- 容量规划:可以用来预测系统的未来容量需求,帮助用户进行容量规划。
- 故障排除:可以用来诊断系统故障,找出异常的地方,帮助用户快速解决问题。
(7)提出建议
在分析结果之后跟测试模型进行比较,进行调参优化或者选择更加合适的产品。对其中出现的问题深入分析进行讨论并且提出建议进行优化
(8)重复测试
当我们对参数进行调优之后,还需要再次进行测试来确认调优后的效果以及寻找更有的参数,重复测试可以对系统进行持续优化和改成,不断完善数据仓库。
四、意义
1.了解系统性能基准作为参照物(性能问题发生后的测试很难了解系统性能基准)
2.识别系统或环境的配置变更对性能响应带来的影响
3.为系统优化前后的性能提升/下降提供参考指标
4.观察系统的整体性能趋势与拐点发生,及早识别系统性能风险
五、实例
下面我将使用Go语言为例进行对算法的一次简单的Benchmark
Go语言标准库内置的 testing 测试框架提供了基准测试的能力
我们对斐波那契数列分别使用递归算法和循环算法分别进行测试
新增一个Fib.go文件
package awesomeProject
func fib(n int) int {
if n == 0 || n == 1 {
return n
}
return fib(n-2) + fib(n-1)
}
func fibfor(n int) int {
if n == 0 || n == 1 {
return n
}
a, b := 0, 1
for i := 2; i <= n; i++ {
a, b = b, a+b
}
return b
}
再编写一个基准测试文件,文件名为Fib_test.go
package awesomeProject
import "testing"
func BenchmarkFib(b *testing.B) {
for n := 0; n < b.N; n++ {
fib(40)
}
}
func BenchmarkFibfor(b *testing.B) {
for n := 0; n < b.N; n++ {
fibfor(40)
}
}
在终端中运行go test -bench=Fib -benchmem命令可以得到
goos: windows
goarch: amd64
pkg: awesomeProject
cpu: AMD Ryzen 7 5800H with Radeon Graphics
BenchmarkFib-16 2 552906550 ns/op 0 B/op 0 allocs/op
BenchmarkFibfor-16 42656655 25.49 ns/op 0 B/op 0 allocs/op
PASS
ok awesomeProject 3.659s
解读测试结果:
在上面的示例代码中,我们得到了基准测试的结果,现在我们就这个来做一个基础的解读。
goos 操作系统
goarch CPU架构
pkg 包名
BenchmarkFib-16 2 552906550 ns/op 0 B/op 0 allocs/op
BenchmarkFibfor-16 42656655 25.49 ns/op 0 B/op 0 allocs/op
16个cpu并行执行,平均执行一次需要552906550 纳秒,1秒之内可运行2次
16个cpu并行执行,平均执行一次需要25.49 ns纳秒,1秒之内可运行42656655次
PASS 表示所有的测试用例都通过了,没有发现错误。这意味着您的代码在测试过程中没有引发任何失败或错误。
ok 表示测试通过,没有发现错误。在基准测试结果中,通常会显示"ok",
这是因为基准测试不会产生失败或错误的结果,只会提供性能指标
此时我们可以明显发现循环的写法比递归写法使用的时间明显快非常多,因此我们可以得出结论我们可以优先选择循环写法来编写程序。
小结:当然这只是一个简单的Benchmark,投入到实际运用上并没有这么简单,还需要对测试集和测试模型等具体选择,还要对结果进行分析调优。逐渐增加系统负载是一个确定系统所能处理的最大吞吐量的简单办法,也是寻找系统性能拐点的可行策略(阶梯式加压测试)。
六、重点
基准测试的工作重点是统计分析:可以从以下几个维度去进行统计:
①、选择合适的测试工具,设定合理的测试方法以及需要确认的系统性能指标;
②、选择不同的测试工具,对测试结果进行对比,选择稳定且能反应系统真实性能表现的结果;
③、多次执行测试,收集大量的测试数据集和指标;
④、从不同维度解读分析数据,生成报告。