本文共 12013 字,大约阅读时间需要 40 分钟。
沃趣科技高级数据库工程师 罗小波
如何使用hammerdb进行MySQL基准测试.
1、hammerdb安装与配置
1.1. 什么是hammerdb
1.2. 安装
- 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
- [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 # 退出交互窗口
- PS:如果安装了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"?>
- ...
- Oracle<!--rdbms>
- TPC-C<!--bm>
- <!--benchmark>
- <!--oracle>
- 127.0.0.1<!--mysql_host>
- 3306<!--mysql_port>
- <!--connection>
- 128<!--my_count_ware>
- 128<!--mysql_num_threads>
- hammerdb<!--mysql_user>
- hammerdb<!--mysql_pass>
- tpcc<!--mysql_dbase>
- innodb<!--storage_engine>
- false<!--mysql_partition>
- <!--schema>
- 1000000<!--my_total_iterations>
- false<!--my_raiseerror>
- false<!--my_keyandthink>
- standard<!--mysqldriver>
- 2<!--my_rampup>
- 5<!--my_duration>
- false<!--my_allwarehouse>
- false<!--my_timeprofile>
- <!--driver>
- <!--tpcc>
- ...
- <!--mysql>
- ...
- <!--hammerdb>
-
PS:
-
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. 启动
- [root@master /usr/local/HammerDB-2.23]
- #cd /usr/local/HammerDB-2.23/
- [root@master /usr/local/HammerDB-2.23]
- #./hammerdb.tcl
2、如何使用hammerdb测试MySQL
2.1. 在GUI窗口进行配置与造数
- 在弹出的窗口中,选择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基准测试
- 双击左侧菜单"Virtual User"下的"Load",载入标准测试驱动程序脚本
-
然后,创建虚拟用户
- 注意:虚拟用户有一个主用户,用于收集其他虚拟用户的统计值和返回状态,主用户包含在你指定的用户数量之内,因此,如果你希望有128个用户(128个并发连接数),那么,你需要创建129个用户,如下图,双击"Virtual User"下的"Options",弹出如下窗口
- 然后双击"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场景的基准测试,大家有兴趣的可以试一试。
-->
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28218939/viewspace-2148813/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28218939/viewspace-2148813/