# 基准测试工具

没有必要开发资金的基准测试系统,除非现有的工具确实无法满足需求。下面介绍一些可用的工具

# 集成式测试工具

已有额集成测试式工具有:

# ab

ab 是 Apache HTTP 服务器基准测试工具。可用测试 HTTP 服务器每秒最多可以处理多少请求。如果测试的是 web 应用服务,这个结果可以转换成整个应用每秒可以满足多少请求。

是个非常简单的工具,用途也有限,只能针对单个 URL 进行尽可能的压力测试。

# http_load

概念上和 ab 类似,也被设计为对 web 服务器进行测试,比 ab 要更加灵活,可以通过一个输入文件提供多个 URL。它会在这些 URL 中随机选择进行测试。也可以定制 http_load,使其按照时间比率进行测试,而不仅仅是测试最大请求处理能力

# JMeter

是一个 Java 应用恒旭,可以加载其他应用并测试其性能。虽然是用来测试 web 应用的,但也可以用于测试诸如 FTP 服务器,或则通过 JDBC 进行数据库查询测试。

它比 ab 或 http_load 要复杂得多。例如:

  • 它可以通过控制预热时间等参数,更加灵活的模拟真实用户的访问。
  • 有绘图接口(带内置的图形化处理的功能)
  • 可以对测试进行记录,然后离线重演测试结果

# 单组件测试工具

有一些有用的工具可以测试 MySQL 和基于 MySQL 的系统性能。后续介绍如何利用这些工具进行测试

# mysqlslap

mysqlslap 可以模拟服务器的负载,并输出计时信息。它包含在 MySQL 5.1 的发型包中。测试时可以执行并发连接数,并指定 SQL 语句(可以在命令行上执行,也可以把 SQL 语句写入到参数文件中)。如果没有指定 SQL 语句,它会自动生成查询 schema 的 SELECT 语句

# MySQL Benchmark Suite(sql-bench)

在 MySQL 的发行包中也提供了一款自己的基准测试套件,可以用于在不同数据库服务器上进行比较屙屎。它是单线程的,主要用于测试服务器执行查询的速度。结果会显示那种类的操作在服务器上执行得更快

该测试套件的主要好处是包含了大量预定义的测试,容易使用,所以可以很轻松的用于比较不同存储引擎或则不同配置的性能测试。也可应用于高层次测试,比较两个服务器的总体性能。当然也可以只执行预定义的测试子集(例如只测试 UPDATE 的性能)。这些测试大部分是 CPU 密集型的,但也有短时间的测试需要大量的磁盘 I/O 操作

该套件最大的缺点主要有:单用户模式,测试的数据集很小且用户无法使用指定的数据,并且同一个测试多次运行的结果可能会相差很大。因为是单线程且串行执行的,所以无法测试多 CPU 的能力,只能用于比较单 CPU 服务器的性能差别。使用该套件测试数据库服务器还需要 Perl 和 BDB 的支持

# Super Smack

是一款用于 MySQL 和 PostgrSQL 的基准测试工具,可以提供压力测试和负载生成。这是一个复杂而强大的工具,可以模拟多用户访问,可以加载测试数据到数据库,并支持使用随机数据填充测试表。测试定义在 「smack」文件中,smack 文件使用一种简单的语法定义测试的客户端、表、查询等测试要素

# Database Test Suite

是由开源软壳开发实验室设计的,发布在 SourceForge 网站上,是一款类似某些工业标准测试的测试工具集,例如由事物处理性能委员会(TPC)制定的各种标准。特别值得一提的是,其中的 dbt2 就是一款免费的 TPC-C OLTP 策测试工具。之前本书作作者经常使用该工具,不过现在已经使用自己研发的专用于 MySQL 的测试工具替代了

# Perconas TPCC-MySQL Tool

类似 TPC-C 的基准测试工具集,其中有部分是专门为 MySQl 测试开放的。在评估大鸭梨下 MySQL 的一些行为时,经常会利用这个工具进行测试(简单的测试,一般会采用 sysbench 替代)

# sysbench

是一款多线程系统压测工具。可以根据影响数据库服务器性能的各种因素来评估系统的性能。

例如,可以用来测试文件 I/O、操作系统调度器、内存分配和传输速度、POSIX 线程,以及数据库服务器等。支持 Lua 脚本语言,Lua 对于各种测试场景的设置可以非常灵活。

sysbench 是我们非常喜欢的一种全能测试工具,支持 MySQL、操作系统和硬件的硬件测试。

# MySQL 的 BENCHMARK()函数

MySQL 有一个内置的 BENCHMARK() 函数,可以测试某些特定操作的执行速度。参数可以是需要执行的次数和表达式。表达式可以是任何的标量表达式,比如返回值是标量的子查询或则函数。该函数可以很方便的测试某些特定操作的性能,比如通过测试可以发现 MD5() 函数比 SHA1() 函数要快

SET @input := 'hello world';
-- 输出都是 0.
SELECT BENCHMARK(1000000,MD5(@input));
1 row in set (2.78 sec)

SELECT BENCHMARK(1000000,SHA1(@input));
1 row in set (3.50 sec)
1
2
3
4
5
6
7

执行返回值永远是 0,可以通过客户端返回的时间来判断执行的时间。要清楚原理,否则容易误用。

该函数只是简单的返回服务器执行表达式的时间,而不会涉及分析和优化的开销。而且表达式必须像这个列子一样包含用户定义的变量,否则多次执行同样的表达式会因为系统缓存命中而影响结果。

它不适合用来做真正的基准测试,因为很难理解真正要测试的是什么,而且测试的只是整个执行周期中的一部分环节。