基准程序的基准程序测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基准程序的基准程序测试相关的知识,希望对你有一定的参考价值。

参考技术A

基准程序测试是应用程序开发生命周期的一个常规部分。它是由应用程序开发人员和数据库管理员(DBA)等小组成员参与的工作,应对您的应用程序执行它,以确定当前性能并提高性能。如果已将应用程序代码编写得尽可能效率高,那么要想再改善性能,可调整数据库和数据库管理器配置参数。甚至可以调整应用程序参数来更好地满足应用程序的需求。
运行不同类型的基准程序测试来发现特定种类的信息:
每秒事务数基准程序确定在某些有限的实验室条件下数据库管理器的吞吐量能力。
应用程序基准程序测试与生产条件接近的条件下的相同吞吐量能力。
调整配置参数的基准程序测试基于这些“现实世界”条件,并需要使用各种参数值反复运行从您的应用程序中获取的SQL,直到应用程序运行得尽可能有效率为止。
此处所描述的基准程序测试方法基于调整配置参数。但是,该基本技术同样可以用于调整影响性能的其它因素,如:
SQL语句
索引
表空间配置
应用程序代码
硬件配置
基准程序测试有助于了解数据库管理器在各种条件下是如何响应的。可以创建多个方案来测试死锁处理、实用程序性能、装入数据的不同方法以及当添加更多的用户时事务执行速率的特征,甚至还可测试使用该产品的新发行版对应用程序产生的影响。
基准程序测试基于可重复的环境,因此在相同条件下运行的相同测试将产生可以合理比较的结果。
可通过在一个正常的环境中运行测试应用程序来开始基准程序测试。随着您缩小性能问题的范围,可以开发专用的测试用例,以限制正测试的功能的作用域。这些专用测试用例不需要仿真整个应用程序来获取有价值的信息。从简单的评估开始,仅在必要时才增加复杂程度。
好的基准程序测试或评估应包括以下特征:
测试是可重复的。
测试的每次迭代在相同系统状态下开始。
除非方案包括系统中执行的一定量的其它活动,否则,系统中的其它功能或应用程序是不活动的。
注:
已启动的应用程序即使是在最小化或空闲时也会占用内存。这样增大了页面调度将使基准程序的运行结果产生偏差和违反可重复性规则的概率。
用于基准程序测试的硬件和软件与您的生产环境匹配。
对于基准程序测试,创建一个方案,然后在此方案中创建几次应用程序,以在每次运行期间捕获关键信息。在每次运行之后捕获关键信息在确定可以提高应用程序和数据库的性能的更改方面具有主要的重要性。
基准程序-基准程序测试创建
当设计和实现基准程序时,考虑各种因素。由于该程序的主要目的是模拟用户应用程序,所以程序的总体结构是变化的。可以将整个应用程序用作基准程序,只需引入某种方法来对要分析的SQL语句进行计时。对于大的或复杂的应用程序,只包括包含重要语句的块可能更实用。
要测试特定SQL语句的性能,可以将这些语句以及必需的CONNECT、PREPARE、OPEN和其它语句以及计时机制一起单独包括在该基准程序中。
另一个要考虑的因素是要使用的基准程序的类型。一个选择是在一个时间间隔内重复运行一组SQL语句。执行的语句数量与此时间间隔的比率就是该应用程序的吞吐量。另一个选择是只确定执行个别SQL语句所需的时间。
对于所有基准程序测试,需要一个高效率的计时系统来计算个别SQL语句或整个应用程序的运行经过时间。要模拟个别SQL语句单独执行所在的应用程序,重点是跟踪CONNECT、PREPARE和COMMIT语句的时间。但是,对于处理多个不同语句的程序,或许只有单个CONNECT或COMMIT是需要的,而可能会优先测试个别语句的执行时间。
尽管每个查询的经过时间是性能分析中的一个重要因素,但可能不必暴露瓶颈。例如,有关CPU使用、锁定和缓冲池I/O的信息可能显示该应用程序达到I/O限制,而不是CPU的使用达到满负荷。基准程序应该允许您获取此类数据,以便在需要时进行更详细的分析。
并非所有的应用程序都将从查询检索到的整组行发送至某个输出设备。例如,整个回答集可能是另一个程序的输入,因此,不发送第一个应用程序的任何行作为输出。格式化屏幕输出的数据常常产生很高的CPU成本,且可能无法反映用户需要。要提供准确的模拟,基准程序应该反映特定应用程序的行处理。如果将行发送至输出设备,则效率不高的格式化可能消耗大量的CPU处理时间,并会误报SQL语句本身的实际性能。
db2batch基准程序工具:在您的实例sqllib目录的bin子目录中提供了一个基准程序工具(db2batch)。此工具使用许多准则,以用于创建基准程序。此工具可以从平面文件或标准输入读取SQL语句,动态地描述和准备这些语句,并返回回答集。它还允许控制回答集的大小以及从此回答集发送至输出设备的行数。
可以指定提供的与性能相关的信息的级别,包括经过时间、CPU和缓冲池的使用情况、锁定和从数据库监视器收集的其它统计信息。如果正在对一组SQL语句进行计时,则db2batch也汇总性能结果,并提供算术和几何平均数。对于语法和选项,在命令行上输入db2batch-h。
此基准程序测试工具也有一个CLI选项。使用此选项,可以指定高速缓存的大小。在下列示例中,db2batch以CLI方式运行,其高速缓存大小为30个语句:
db2batch-dsample-fdb2batch.sql-cli30可以在远程运行db2batch。若使用基准程序工具的
-f或
-o命令参数,则:
控制选项
perf_detail和
-p(指定要返回的性能信息级别)当设置为大于1时不受支持(在远程运行时)。
除了这两项以外,
perf_detail和
-p在所有“DB2(R)通用数据库”平台上都受支持且有效。
基准程序-基准程序测试执行
对于一种类型的数据库基准程序,选择一个配置参数并使用该参数的不同值运行该测试,直至达到最佳效果。单个测试应该包括通过相同参数值的多次迭代(例如,20或30次)来执行该应用程序以获取平均计时,这可以更清楚地显示参数更改所产生的影响。
当运行基准程序时,应该将第一次迭代(称为热身运行)视为不同于后续迭代(称为正常运行)的一种特殊情况。因为热身运行包括某些启动活动(例如,初始化缓冲池),因此,花费的时间比正常运行要稍微长一些。虽然来自热身运行的信息可能实际上是有效的,但从统计角度来说是无效的。当计算一组特定参数值的平均计时或CPU时,仅使用来自正常运行的结果。
可以考虑使用“配置顾问程序”来创建基准程序的热身运行。“配置顾问程序”问到的问题可以涉及到在进行基准程序活动期间为正常运行调整环境配置时要考虑的若干事宜。可以从“控制中心”或通过带适当选项执行db2自动配置命令来启动“配置顾问程序”。
如果基准程序测试使用单个查询,则通过刷新缓冲池来确保最小化先前查询的潜在影响。要刷新缓冲池,读取与查询无关的大量的页来填充该缓冲池。
在完成单组参数值的迭代之后,可以更改单个参数。但是,在每个迭代之间,执行下列任务,以便将基准程序的环境复原至它的初始状态:
.如果由于测试的需要更新了目录统计信息,则要确保每个迭代都使用相同的统计值。
如果测试更新了测试中使用的数据,则此数据必须保持一致。为此:
使用RESTORE实用程序来复原整个数据库。数据库的备份副本包含它的先前状态,即已准备好进行下次测试。
使用IMPORT或LOAD实用程序来复原该数据的导出副本。此方法只允许复原受影响的数据。应对包含此数据的表和索引运行REORG和RUNSTATS实用程序。
要将应用程序返回至它的原始状态,将应用程序重新绑定至数据库。
概括起来,遵循以下步骤或迭代来对数据库应用程序执行基准测试:
第一步
除下列参数外,将数据库和数据库管理器的其他调整参数保持为它们的缺省值:
对于测试的工作负载和目标很重要的那些参数。(您很少有足够的时间执行基准程序测试以调整所有参数,所以可能需要使用某些参数的最佳推测值并从该点上开始调整。)
日志大小,它应在应用程序的单元测试和系统测试期间确定。
为了使应用程序能够运行而必须更改的参数(即,为防止出现语句堆内存用完这类事件而导致产生负的SQL返回码所需的更改)。
对此初始情况运行一组迭代,然后计算平均计时或CPU。
第二步
选择一个且唯一一个调整参数来测试,并更改它的值。
第三步
运行另一组迭代,然后计算平均计时或CPU。
第四步
根据基准程序测试的结果,执行下列其中一项操作:
如果性能提高,则更改同一个参数的值并返回至第三步。继续更改此参数,直到产生最大效益为止。
如果性能降低或保持不变,则将该参数返回至其原来的值,返回至第二步,并选择新的参数。重复此过程,直到所有的参数都已被测试为止。
注:
如果您想将该性能结果绘制成图表,则要查找曲线开始上升或下降的点。
可以编写一个驱动程序,以帮助您进行基准程序测试。可使用REXX之类的语言来编写此驱动程序,或者对于基于UNIX的平台,使用shell脚本。
此驱动程序将执行基准程序,将适当的参数传送给它,通过多次迭代驱动该测试,将环境复原至一致的状态,使用新的参数值设置下一个测试,以及收集/合并测试结果。这些驱动程序可以很灵活,它们可用于运行一整套基准程序测试,分析结果,并为给定测试提供一个最终和最优参数值报告。
基准程序-基准程序评测方法
基准程序评测方法是微处理器性能评价的重要尺度。本文在介绍基准测试程序的基础上,重点对CPU基准测试、嵌入式处理器和媒体处理器基准程序测试进行了分析,并给出了Tensilica微处理器与其它几款当今重要的微处理器的EEMBC和BDTI评测结果。
嵌入式和媒体基准测试程序包括EDN嵌入式微处理器测试程序组EEMBC(嵌入式微处理器基准测试协会)、BDTI基准测试程序组、MediaBench测试程序组以及MiBench基准测试程序组。其中,EEMBC、BDTI已经称为嵌入式处理器和媒体处理器评测事实上的标准。
EEMBC主要是开发和验证现实世界的基准测试和基准测试得分,帮助设计师选择与系统适用的嵌入式处理器。提交EEMBC进行基准测试的所有处理器都需要进行代表不同载荷和性能参数的多项测试,如通信、网络、消费、办公自动化、汽车/工业、嵌入式Java和微控制器相关的应用。EEMBC的成员包括领先的半导体、IP供应商和编译器公司,EEMBC建立了基准测试标准,并通过EEMBC验证实验室(ECL)提供通过了验证的基准测试结果。
BDTI基准测试程序组由BDTI(BerkeleyDesignTechnology)公司开发,该公司从1991年开始致力于数字信号处理器的评测工作。BDTI提供业界标准的BDTI基准测试程序,用于测试DSP处理器。BDTI还开发了用户定制的基准测试程序,专门用于某些应用领域的测试。BDTI测试程序包括FIR滤波器、IIR滤波器、FFT、向量点积和Viterbi译码。
MediaBench基准测试程序主要来自图像处理、通信和DSP应用领域。例如JPEG、MPEG、GSM、G.721话音压缩、Ghostscript和ADPCM。JPEG主要是图像压缩,MPEG用于视频传输中的编解码。Ghostscript是Postscript语言解释器,ADPCM用于自适应差分脉冲编码调整。
MiBench是一个自由的嵌入式基准测试程序组,同EEMBC类似。由于EEMBC不对专用研究人员自由开发,故密执安的研究人员对35个嵌入式程序进行编译,形成了MiBench基准测试程序组。以EEMBC为模型,MiBench分成6类:汽车电子、消费类电子、网络、办公自动化、信息安全和电信。所有程序均采用C语言写成。MiBench可以和任何嵌入式平台接口,因为所有测试均是源码开放的。

Go中的单元测试和基准测试

单元测试:测试程序在各种数据下的准确性

基准测试(压力测试):测试程序的速度及弹性

testing包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能

测试文件必须满足 *_test.go这种格式*代表源文件的名字(测试代码和业务代码分开了)

_test程序不会被普通的Go编译器编译。只有gotest会编译所有的程序(普通和测试)
测试文件(测试源代码)中必须导入import testiong
测试函数必须以TestZzz为格式(Zzz是函数名,如TestAdd(t *testing.T))
T是传给测试函数的结构类型,用来管理测试状态,支持格式化测试日志,t.Log,t.Error,t.ErrorF

以下函数用来通知测试失败:
func (t *T)Fail()//标记为失败,并继续执行
func (t *T) FailNow()//标记为失败并终止此文件的执行,继续下一个文件
func (t *T) Log(args ...interface)//args 被用默认的格式格式化并打印到错误日志。
func (t *T) Fatal(args ...interface)//先执行第三个,在执行第二个(上面两个的综合)

go test来编译测试程序,并执行程序中所有的TestZzz函数,所有的测试都通过会打印出PASS
gotest可以接收多个go文件作为参数,并指定选项。结合 --chatty或-v选项,每个执行的测试函数以及测试状态会被打印。
例如 go test fmt_test.go --chatty

testing包中有一些类型和函数可以用来做简单的基准测试:测试代码中必须包含BenchmarkZzz
以Benchmark开头,并接收一个 *testing.B的类型的参数

go test -test.bench=.* 会运行所有的基准测试函数。(代码中的函数会被调用N次,并展示N的值和函数执行的平均时间,单位为ns。如果使用testing.Benchmark调用这些函数,只会直接运行)

package even
import "testing"
func TestEven(t *testing.T)

for num := 0;num <=100 ;num++
if Even(num)
t.Log("is a Even")
else
t.FailNow()


func TestOdd(t *testing.T)
for num := 0;num<= 100 ;num++
if Odd(num)
t.Log("is a odd")
else
t.Log("is.t a odd")


package even

func Even(i int)bool

if i%2 == 0
return true
else
return false


func Odd(i int)bool
if i%2 == 0
return false
else
return true

单元测试:
对于测试程序来说,go test 包名 会直接运行包内所有的_test.go文件,以及这些文件各自所含有的TestXxx函数。(注意是自动执行,相当于执行主函数一样,执行结束之后转而执行下一个。类似于主函数吧。并在控制台打印函数里要打印的。注意,不需要主函数,这是个测试框架testing)

基准测试:
func BenchmarkEven(b *testing.B)

for num := 0;num <=100 ;num++
num := 101
Even(num)
fmt.Println("asdf")


func BenchmarkOdd(b *testing.B)
num := 100
Odd(num)
fmt.Println("asdfasdf")

以上是关于基准程序的基准程序测试的主要内容,如果未能解决你的问题,请参考以下文章

Go中的单元测试和基准测试

java.lang.NoClassDefFoundError:javaslang / collection / LinkedHashMap使用jmh对spring数据应用程序进行基准测试

对具有许多同时请求的 django 应用程序进行基准测试,例如 ab

如何在处理程序中对龙卷风处理程序进行基准测试?

Java优化实战「微基准系列」带你脚踏实地的进行开发和使用JMH测试和提升应用程序和服务指南

有没有比计时更好的方法来对 C 程序进行基准测试?