HammerDB数据库压力工具

HammerDB数据库压力工具下载

服务器配置:960G sandisk单盘SSD,32 core,128G内存;

数据库关键参数:innodb_buffer_pool_size=72G,双一,innodb_log_file_size=4G,innodb_log_buffer_size=128M,innodb_buffer_pool_instances=32;

1、HammerDB安装与配置

1.1. 什么是hammerdb

HammerDB是针对Oracle,Microsoft SQL Server,IBM DB2,TimesTen,MySQL,MariaDB,PostgreSQL,Postgres Plus Advanced Server等数据以及Greenplum,Redis,Amazon Aurora和Redshift以及Hadoop上的传统 SQL的开源数据库负载测试和基准测试工具。

可以模拟TPC-C测试模型(是在线事务处理OLTP的基准程序),主要用于模拟一个批发商的货物管理环境,测试结果由TPC-C吞吐率衡量,标准测试模型中的单位是tpmC(在hammerdb中,测试结果的单位是tpm,不是tpmC。tpm表示每分钟的事务交易数量。tpmC是TPC-C的事务交易单位)。

也可以模拟TPC-H测试模型(是在线分析处理OLAP的基准程序),主要用来模拟供应商和采购商之间的交易行为,测试结果由TPCH Power来衡量,该值与数据量和交易平均时间有关,表示一个小时内能够完成的复杂交易的数量。

1.2. 安装

下载hammerdb安装包

wget https://nchc.dl.sourceforge.net/project/hammerora/HammerDB/HammerDB-2.23/HammerDB-2.23-Linux-x86-64-Install

下载文件是一个安装程序,直接执行这个程序进行安装

[root@master /root]
#chmod +x HammerDB-2.23-Linux-x86-64-Install
[root@master /root]
#./HammerDB-2.23-Linux-x86-64-Install
This will install HammerDB on your computer.  Continue? [n/Y] y
Where do you want to install HammerDB? [/usr/local/HammerDB-2.23]
Installing HammerDB...
Installing Program Files...                                                  
Installation complete.  

查看安装目录

[root@master /root]
#cd /usr/local/HammerDB-2.23/
[root@master /usr/local/HammerDB-2.23]
#ll
total 1508
drwx------  2 root    4096 Dec  5 15:51 agent
drwxr-xr-x  2 root    4096 Dec  5 15:51 bin
-rw-r--r--  1 root  25744 Jun 16 19:24 ChangeLog
-rw-r--r--  1 root  13789 Jun  8 01:05 config.xml
-rw-r--r--  1 root    618 Dec 20  2016 COPYRIGHT
-rw-r--r--  1 root  18009 Feb 16  2013 hammerdb.license
-rwxr--r--  1 root    7050 Mar 14  2017 hammerdb.tcl
drwxr-xr-x  2 root    4096 Dec  5 15:51 hdb-components
drwxr-xr-x  2 root    4096 Dec  5 15:51 hdb-modules
drwxr-xr-x  2 root    4096 Dec  5 15:51 include
drwxr-xr-x 21 root    4096 Dec  5 15:51 lib
-rw-r--r--  1 root    883 Mar 14  2017 readme
-rwxr-xr-x  1 root 1433874 Dec  5 15:51 uninstall

1.3. 配置

环境变量

[root@master /usr/local/HammerDB-2.23]
#export MYSQL_HOME=/usr/local/mysql/


[root@master /usr/local/HammerDB-2.23]
#echo 'export MYSQL_HOME=/usr/local/mysql/' >> /etc/profile


[root@master /usr/local/HammerDB-2.23]
#export LD_LIBRARY_PATH=/usr/local/HammerDB-2.23/lib/:$MYSQL_HOME/lib


[root@master /usr/local/HammerDB-2.23]
#echo 'export LD_LIBRARY_PATH=/usr/local/HammerDB-2.23/lib/:$MYSQL_HOME/lib' >> /etc/profile


[root@master /usr/local/HammerDB-2.23]
#export PATH=$MYSQL_HOME/bin:$PATH


[root@master /usr/local/HammerDB-2.23]
#echo 'export PATH=$MYSQL_HOME/bin:$PATH' >> /etc/profile

安装hammerdb GUI依赖包

[root@master /usr/local/HammerDB-2.23]
#yum install libXScrnSaver xorg-x11-fonts* -y

验证环境变量

[root@master /usr/local/HammerDB-2.23]
#cd /usr/local/HammerDB-2.23/


[root@master /usr/local/HammerDB-2.23]
#ll
total 1512
drwxr-xr-x 2 root    4096 Dec  5 09:29 bin
-rw-r--r-- 1 root  13849 Apr  7  2011 ChangeLog
-rw-r--r-- 1 root    4287 Apr  7  2011 config.xml
-rw-r--r-- 1 root    609 Mar 30  2011 COPYRIGHT
-rw-r--r-- 1 root  18009 Mar 14  2007 hammerora.license
-rwxr--r-- 1 root  38983 Mar 30  2011 hammerora.tcl
drwxr-xr-x 2 root    4096 Dec  5 09:29 hora-components
drwxr-xr-x 2 root    4096 Dec  5 09:29 include
drwxr-xr-x 9 root    4096 Dec  5 09:29 lib
-rw-r--r-- 1 root    608 Mar 30  2011 readme
-rwxr-xr-x 1 root 1434065 Dec  5 09:29 uninstall


[root@master /usr/local/HammerDB-2.23]
#./bin/tclsh8.6
% package require mysqltcl  # 检测环境变量
3.05  # 这个地方如果正常输出一个版本号而无报错,说明环境变量配置生效
% exit  # 退出交互窗口

补充:如果安装了sysbench 1.0,则可能报如下错误

[root@master /usr/local/HammerDB-2.23]
#./bin/tclsh8.6
% package require mysqltcl
couldn't load file "/usr/local/HammerDB-2.23/lib/mysqltcl-3.052/libmysqltcl3.052.so": /usr/lib64/libmysqlclient.so.18: version `libmysqlclient_18' not found (required by /usr/local/HammerDB-2.23/lib/mysqltcl-3.052/libmysqltcl3.052.so)


# 此时,我们把sysbench 1.0中percona的那个依赖包软链去掉,就可以了
[root@master /root]
#locate libmysqlclient.so.18
/home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18
/home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18.1.0
/home/woqu/qdata-dev-env/mysql5.5.25a/lib/libmysqlclient.so.18
/home/woqu/qdata-dev-env/mysql5.5.25a/lib/libmysqlclient.so.18.0.0
/usr/lib64/libmysqlclient.so.18


[root@master /root]
#ll /usr/lib64/libmysqlclient.so.18
lrwxrwxrwx 1 root 22 Nov  1 11:56 /usr/lib64/libmysqlclient.so.18 -> libmysqlclient_r.so.16


[root@master /root]
#unlink /usr/lib64/libmysqlclient.so.18


[root@master /root]
#ln -s /home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18


# 如果需要使用sysbench 1.0时,重新换一下软链即可,当然,由于这里我们是使用的MySQL 5.6.x的lib库,两者都可以使用,无需换软链

修改配置文件

所有HammerDB的工作数据都可以在hammerdb界面启动之后,使用菜单选项进行临时设置。 但是,如果你经常需要做某个测试,希望这些配置持久化而不需要每次都去临时设置,那么你可以在HammerDB的工作目录下名为config.xml的配置文件中进行设置,该配置文件将在hammerdb启动时读取。

在这个文件中,您可以通过编辑xml文件来预设模式构建和驱动程序配置,而无需每次都去临时手动更改。 如果你的xml文件格式正确(无格式错误),当你在测试过程中选择对应的菜单选项时,你在xml文件中设置的变量将被应用到HammerDB上,例如(这里我们只看mysql的tpc-c部分):

[root@master /usr/local/HammerDB-2.23]
#pwd
/usr/local/hammerora-2.6


[root@master /usr/local/HammerDB-2.23]
#cat config.xml
<?xml version="1.0" encoding="utf-8"?>
<hammerdb>
...
<benchmark>
       <rdbms>Oracle</rdbms>
       <bm>TPC-C</bm>
</benchmark>
<oracle>
...
</oracle>
...
<mysql>
   <connection>
       <mysql_host>127.0.0.1</mysql_host>
       <mysql_port>3306</mysql_port>
   </connection>
       <tpcc>
       <schema>
           <my_count_ware>128</my_count_ware>
           <mysql_num_threads>128</mysql_num_threads>
           <mysql_user>hammerdb</mysql_user>
           <mysql_pass>hammerdb</mysql_pass>
           <mysql_dbase>tpcc</mysql_dbase>
           <storage_engine>innodb</storage_engine>
           <mysql_partition>false</mysql_partition>
       </schema>
       <driver>
           <my_total_iterations>1000000</my_total_iterations>
           <my_raiseerror>false</my_raiseerror>
           <my_keyandthink>false</my_keyandthink>
           <mysqldriver>standard</mysqldriver>
           <my_rampup>2</my_rampup>
           <my_duration>5</my_duration>
           <my_allwarehouse>false</my_allwarehouse>
           <my_timeprofile>false</my_timeprofile>
       </driver>
   </tpcc>
...
</mysql>
...
</hammerdb>

补充

  • mysql_num_threads设置一定不能比my_count_ware仓库数量大,否则后面造数会卡在创建存储过程的地方
  • 生产环境压测,仓库建议不少于100个,仓库数量太少时,并发线程数(虚拟用户数量)增加时,会有大量线程因为操作同一行记录而导致大量锁等待(基本在commit阶段)
  • 生产环境中my_total_iterations中总的迭代查询量不建议不低于500W,这里为了快速演示,保留默认的100W
  • 由于hammerdb是GUI界面的,需要使用securecrt或xshell等终端工具配置X11协议转发,且最好使用终端工具直连安装hammerdb的服务器,否则配置起来非常繁琐

登录待测试的MySQL实例,创建测试账号

mysql> grant all on tpcc.* to hammerdb@'%' identified by 'hammerdb';
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql>

1.4. 启动

启动hammerdb

[root@master /usr/local/HammerDB-2.23]
#cd /usr/local/HammerDB-2.23/


[root@master /usr/local/HammerDB-2.23]
#./hammerdb.tcl

启动之后界面如下

补充:

如果在xshell和securecrt终端启动报错,请按照如下链接介绍的方法处理(mac版本的securecrt可能因为部分版本有BUG,无法弹窗,那就用虚拟机吧,虽然xshell可以弹窗,但是确没有mac版本)

http://www.itshuji.com/technical-article/1764.html

注意,配置完成后需要关闭现有终端的连接,并重新连接才会生效

2、如何使用hammerdb测试MySQL

2.1. 在GUI窗口进行配置与造数

双击左侧MySQL,如下图

在弹出的窗口中,选择MySQL和TPC-C,如下图

切换基准测试数据库类型之后,依次展开TPC-C->Schema Build,并双击Options

在弹出的窗口中,配置好相关的参数(由于之前我们配置过config.xml文件,所以这里已经有填写好的默认值了,这里无需再填写),如下图:

然后点击如下图所示的”build”或者按钮,开始创建基准测试数据库:

然后,可以看到如下输出信息,注意:下面1,2,3,4,5,6…这个输出行的status列不能出现一把红叉的情况,如果有则表示发生了报错,当worker完成后,监视线程会创建索引、存储过程并收集统计信息。虚拟用户1将显示信息“TPCC SCHEMA COMPLETE”字样,其他所有虚拟用户将显示已成功完成其操作的字样,如果没有看到,则说发生了错误。可以在最下方的文本输出框查看报错信息 :

现在,我们使用MySQL命令行客户端登录数据库,可以查看到当前的一些连接进程和数据库表:

mysql> show processlist;
......
| 7173 | hammerdb | 10.10.30.14:44066 | tpcc              | Query  |    1 | update            | insert into stock (`s_i_id`, `s_w_id`, `s_quantity`, `s_dist_01`, `s_dist_02`, `s_dist_03`, `s_dist_ |
| 7174 | hammerdb | 10.10.30.14:44067 | tpcc              | Sleep  |    1 |                  | NULL                                                                                                |
| 7175 | hammerdb | 10.10.30.14:44068 | tpcc              | Sleep  |    2 |                  | NULL                                                                                                |
| 7176 | hammerdb | 10.10.30.14:44069 | tpcc              | Sleep  |    1 |                  | NULL                                                                                                |
| 7177 | hammerdb | 10.10.30.14:44070 | tpcc              | Query  |    0 | starting          | insert into stock (`s_i_id`, `s_w_id`, `s_quantity`, `s_dist_01`, `s_dist_02`, `s_dist_03`, `s_dist_ |
| 7178 | hammerdb | 10.10.30.14:44071 | tpcc              | Sleep  |    1 |                  | NULL                                                                                                |
+------+----------+-------------------+--------------------+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
131 rows in set (0.00 sec)


mysql> use tpcc
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> show tables;
+----------------+
| Tables_in_tpcc |
+----------------+
| customer      |
| district      |
| history        |
| item          |
| new_order      |
| order_line    |
| orders        |
| stock          |
| warehouse      |
+----------------+
9 rows in set (0.00 sec)

造数完成之后,可以看到“TPCC SCHEMA COMPLETE”字样,如下图:

schema创建完成之后,我们可以登录数据库中简单查询以下数据(注意:如果以下三个语句任意一个查询到无结果,说明造数失败,会导致后续load测试无法进行):

# 查询表中的数据
mysql> use tpcc
Database changed
mysql> select * from warehouse limit 1 \G
*************************** 1. row ***************************
      w_id: 1
    w_ytd: 3000000.00
    w_tax: 0.1700
    w_name: QDomcHSyn
w_street_1: hEvTR42ePpREnM
w_street_2: 0JfWR5A2quAudxrLyA
    w_city: EzRKodmYv0
  w_state: 9l
    w_zip: 966011111
1 row in set (0.00 sec)


# 查询表中的索引
mysql> show indexes from warehouse \G
*************************** 1. row ***************************
        Table: warehouse
  Non_unique: 0
    Key_name: PRIMARY
Seq_in_index: 1
  Column_name: w_id
    Collation: A
  Cardinality: 10
    Sub_part: NULL
      Packed: NULL
        Null: 
  Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)


# 查询存储过程
mysql> select routine_name from information_schema.routines where routine_schema = 'TPCC';
+--------------+
| routine_name |
+--------------+
| DELIVERY    |
| NEWORD      |
| OSTAT        |
| PAYMENT      |
| SLEV        |
+--------------+
5 rows in set (0.01 sec)

2.2. 使用hammerdb进行oltp基准测试

前面2.1小节已经按照tpc-c模型(oltp模型)创建好了测试库tpcc,现在,我们基于tpcc库进行oltp测试

造数完成之后,我们点击”Destroy Virtual Users”按钮停止造数的进程:

然后左侧列表双击”Driver Script” :

弹出如下图对话框,这里有两个TPC-C驱动程序脚本,您可以选择标准驱动程序脚本(Standard Driver Script)或定时测试驱动程序脚本(Timed Test Driver Script),此选项选择不同的值会动态修改掉左侧”Driver Script”下的”Load”加载的脚本内容,该脚本是由左侧菜单”Virtual User”配置的虚拟用户运行的脚本,用于执行基准测试。这两种选项加载的不同驱动程序脚本的区别如下:

  • Standard Driver Script:不定时,用于无法估计测试时长或者想手动选择恰当的时机终止的场景,选择该脚本,在Virtual User Output标签页中或输出日志文件中会打印具体的执行SQL
  • Timed Test Driver Script:指定测试时长的驱动程序脚本,选择该项可以设置Minutes of Rampup Time和Minutes for Test Duration两个配置项,前者是指定预热时长,后者是指定总的基准测试时长,选择该脚本,在Virtual User Output标签页或输出日志文件中,只有虚拟用户列表,不打印具体的SQL

补充:

为了方便演示基准测试曲线,我们这里选择第一种,如下图

双击左侧菜单”Virtual User”下的”Load”,载入标准测试驱动程序脚本

然后,创建虚拟用户。

注意:虚拟用户有一个主用户,用于收集其他虚拟用户的统计值和返回状态,主用户包含在你指定的用户数量之内,因此,如果你希望有128个用户(128个并发连接数),那么,你需要创建129个用户,如下图,双击”Virtual User”下的”Options”,弹出如下窗口

要注意:

下图中的”Show Output”选项建议勾选,否则基准压测过程中的相关日志输出无法打印(Virtual User Output标签页)

  • Show Output:勾选之后会打印虚拟用户列表和相关的日志输出到Virtual User Output标签页
  • Log Output to Temp:勾选之后会创建/tmp/hammerdb.log文件,用于存放压测过程中的日志输出信息
  • Use Unique Log Name:勾选之后会为每次压测创建一个唯一的日志输出文件,用于存放压测过程中的日志输出信息,例如:/tmp/hammerdb_5A267C6555F903E273734353.log
  • No Log Buffer:勾选之后不缓冲日志 :

然后双击”Virtual User”下的”Create”按钮,创建虚拟用户(准备要并发连接线程,注意此时数据库中并未真正创建连接) :

然后双击左侧”Virtual User”下的”Run”,开始执行基准测试 :

此时,登录到数据库中,你可以发现有129个hammerdb用户的线程在运行:

mysql> show processlist;
......
| 7302 | hammerdb | 10.10.30.14:44195 | tpcc | Query  |    0 | closing tables    | COMMIT                                                                                              |
| 7303 | hammerdb | 10.10.30.14:44196 | tpcc | Sleep  |    0 |                  | NULL                                                                                                |
| 7304 | hammerdb | 10.10.30.14:44197 | tpcc | Query  |    0 | query end        | INSERT INTO order_line (ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity,  |
| 7305 | hammerdb | 10.10.30.14:44198 | tpcc | Query  |    0 | updating          | UPDATE order_line SET ol_delivery_d = timestamp
WHERE ol_o_id = d_no_o_id AND ol_d_id = d_d_id AND
o |
| 7306 | hammerdb | 10.10.30.14:44199 | tpcc | Query  |    0 | optimizing        | SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_ |
| 7307 | hammerdb | 10.10.30.14:44200 | tpcc | Sleep  |    0 |                  | NULL                                                                                                |
| 7308 | hammerdb | 10.10.30.14:44201 | tpcc | Query  |    0 | NULL              | COMMIT                                                                                              |
+------+----------+-------------------+------+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
131 rows in set (0.00 sec)

此时,我们需要查看tpm的值,可以点击如下图所示的按钮:

然后,可以从如下图所示的窗口中,等待几十秒即可看到数值,再过一会就可以看到曲线图,使用曲线图可以更直观地发现性能抖动问题 :

如果要终止测试和终止tpm统计输出,可以依次点击如下图所示的两个按钮(第一个表示终止基准测试,第二个表示终止tpm统计输出):

3、总 结

我们平时测试MySQL时,大多数时候都是使用的sysbench、tpcc-mysql等基准测试工具,现在,你可以尝试着使用hammerdb来对MySQL做一做基准测试,虽然HammerDB测试工具大多数时候我们听到的都是用于Oracle测试。但却不失为一种选择。另外,前面提到过,HammerDB还支持olap场景的基准测试,大家有兴趣的可以试一试。

参考资料:

http://www.hammerdb.com/hammerdb_mysql_oltp.pdf
http://www.hammerdb.com/hammerdb_quickstart_mysql.pdf

本文分享自微信公众号 – 沃趣科技(woqutech),作者:罗小波

原文出处及转载信息见文内详细说明,如有侵权,请联系 [email protected] 删除。

原始发表时间:2017-12-25

https://cloud.tencent.com/developer/article/1072939?from=information.detail.hammerdb