你有什么建议可以给我写一个有意义的基准?

时间:2008-11-27 16:37:35

标签: benchmarking

我开发了一个由我们组织中的几个团队使用的框架。在这个框架之上开发的那些“模块”可以表现得完全不同,但即使有些人比其他人更多,但它们都是非常耗费资源的。它们都在输入中接收数据,分析和/或转换数据,并进一步发送。

我们计划购买新硬件,我的老板让我根据模块定义和实施基准测试,以便比较我们获得的不同报价。

我的想法是简单地用一组精心选择的数据作为输入顺序开始每个模块。

你有什么建议吗?关于这个简单程序的任何评论?

6 个答案:

答案 0 :(得分:9)

你的问题非常广泛,不幸的是我的回答也不是很具体。

首先,基准测试很难。不要低估产生有意义,可重复,高可信度的结果所需的努力。

第二,你的表现目标是什么?是吞吐量(事务或每秒操作)?它是延迟(执行事务所需的时间)吗?你关心平均表现吗?我是否关心最坏情况的表现?你是否关心绝对最坏的情况,或者我关心90%,95%或其他百分位得到足够的表现?

根据您的目标,您应该设计基准来衡量该目标。因此,如果您对吞吐量感兴趣,您可能希望以指定的速率向系统发送消息/事务/输入,并查看系统是否保持正常运行。

如果您对延迟感兴趣,您可以发送消息/交易/输入并测量处理每个消息所需的时间。

如果您对最坏情况的性能感兴趣,那么您将为系统增加负载,直到达到您认为“真实”的任何内容(或者系统设计应该支持的任何内容)。

其次,您没有说这些模块是否会受CPU限制,I / O限制,是否可以利用多个CPU /核心等。当您尝试评估不同的硬件解决方案时,您可能会发现您的应用程序从一个出色的I / O子系统和大量CPU中获益更多。

第三,最好的基准(也是最难的)是将实际负载放入系统。这意味着,您从生产环境记录数据,并通过此数据放置新的硬件解决方案。完成此操作比听起来更难,通常,这意味着在系统中添加各种测量点以查看其行为(如果您还没有它们),修改现有系统以添加记录/回放功能,修改播放以不同的速率运行,并获得逼真(即类似于生产)的测试环境。

答案 1 :(得分:2)

最有意义的基准是衡量代码在日常使用中的表现。这显然会为您提供最真实的数字。

选择几个真实数据集,并将它们放入您的组织每天使用的相同流程中。要获得额外的功劳,请与使用您的框架的人交谈,并要求他们提供一些“最佳情况”,“正常”和“最坏情况”的数据。如果存在隐私问题,请对数据进行匿名化,但尽量不要更改可能影响性能的任何内容。

请记住,您正在对两组硬件进行基准测试和比较,而不是您的框架。将所有软件视为黑盒子,只需测量硬件性能。

最后,请考虑保存数据集并使用它们来类似地评估您对软件所做的任何后续更改。

答案 2 :(得分:1)

如果您的系统应该能够同时处理所有呼叫的多个客户端,那么您的基准测试应该反映这一点。请注意,某些调用无法在一起播放。例如,有25个线程同时发布相同的信息可能会导致服务器端锁定,从而扭曲您的结果。

从一个具体的角度来看,我使用Perl及其Benchmark module来收集我关心的信息。

答案 3 :(得分:1)

如果您正在比较不同的硬件,那么衡量每笔交易的成本将为您提供良好的硬件权衡比较。一种配置可以为您提供最佳性能,但成本太高。较便宜的配置可以为您提供足够的性能。

模拟负载的“最坏情况”或“高峰时段”非常重要。用“典型”卷进行测试也很重要。这是一种平衡的行为,可以获得良好的服务器利用率,而且成本不会太高,从而提供所需的性能。

跨硬件配置的测试很快就会变得昂贵。另一个可行的选择是首先测量您的配置,然后使用模型在虚拟系统中模拟该行为。

答案 4 :(得分:0)

如果可以的话,尝试记录一些操作用户(或进程)正在使用您的框架,理想情况下使用真实系统的克隆。这为您提供了最真实的数据。需要考虑的事项:

  1. 最常用的功能是什么?
  2. 传输了多少数据?
  3. 不要假设任何事情。如果你认为“那将是快/慢”,不要赌它。在10个案例中有9个案例,你错了。
  4. 为1 + 2创建前十名并从中开始工作。

    说:如果用新硬件替换旧硬件,那么自购买第一套产品以来,每年的执行速度大约要快10%(如果系统非常相同)。

    如果您有专门的系统,数字可能会完全不同,但通常情况下,新硬件的变化不大。例如,向数据库添加有用的索引可以将查询的运行时间从两小时减少到两秒。硬件永远不会给你那个。

答案 5 :(得分:0)

正如我所看到的,在基准测试软件方面有两种基准。首先,当您尝试单独评估一段代码或系统如何处理狭义定义的工作负载时,微基准测试。比较用Java编写的两种排序算法。比较两个Web浏览器每个执行某些DOM操作操作的速度有多快。其次,当您尝试在实际工作负载下评估软件系统时,有系统基准测试(我刚刚建立了名称)。比较我在Google Compute Engine和Amazon AWS上运行的基于Python的后端。

在处理Java等时,请记住,VM需要预热才能为您提供逼真的性能。如果使用time命令测量时间,则将包括JVM启动时间。您几乎总是想要忽略启动时间或单独跟踪它。

Microbenchmarking

在第一次运行期间,CPU缓存充满了必要的数据。磁盘缓存也是如此。在几次后续运行期间,VM继续预热,这意味着JIT会编译它认为有助于编译的内容。您想忽略这些运行并在之后开始测量。

进行大量测量并计算一些统计数据。平均值,中位数,标准差,绘制图表。看看它,看看它有多大变化。可能影响结果的事情包括VM中的GC暂停,CPU上的频率缩放,其他一些进程可能启动一些后台任务(如病毒扫描),OS可能决定将进程移动到不同的CPU核心上,如果你{{3架构,结果会更加明显。

对于微基准测试,所有这些都是一个问题。在开始之前杀死你可以使用的流程。使用可以为您完成部分工作的基准测试库。像have NUMA之类似。

系统基准测试

如果在实际工作负载下对系统进行基准测试,这些详细信息对您并不感兴趣,您的问题“仅”了解实际工作负载是什么,如何生成它以及要收集哪些数据。如果您可以检测生产系统并在那里收集数据,这总是最好的。您通常可以这样做,因为您正在测量最终用户特征(网页呈现多长时间)并且这些是I / O绑定的,因此代码收集数据不会减慢系统速度。 (该页面需要通过网络发送给用户,如果我们还在过程中记录了一些数字也没关系。)

请注意性能分析和基准测试之间的区别。基准测试可以给你绝对的时间做某事,分析给你相对于其他所有需要做的事情所花费的相对时间。这是因为分析器运行了大量仪表程序(常见的技术是每隔几百毫秒停止一次并保存堆栈跟踪),仪器会显着降低所有内容。