如何使用hammerdb進行MySQL基準測試

沃趣科技發表於2017-12-18

沃趣科技高階資料庫工程師   羅小波




如何使用hammerdb進行MySQL基準測試.

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安裝包

點選(此處)摺疊或開啟

  1. wget https://nchc.dl.sourceforge.net/project/hammerora/HammerDB/HammerDB-2.23/HammerDB-2.23-Linux-x86-64-Install
  • 下載檔案是一個安裝程式,直接執行這個程式進行安裝

點選(此處)摺疊或開啟

  1. [root@master /root]
  2. #chmod +x HammerDB-2.23-Linux-x86-64-Install
  3. [root@master /root]
  4. #./HammerDB-2.23-Linux-x86-64-Install
  5. This will install HammerDB on your computer. Continue? [n/Y] y
  6. Where do you want to install HammerDB? [/usr/local/HammerDB-2.23]
  7. Installing HammerDB...
  8. Installing Program Files...
  9. Installation complete.
  • 檢視安裝目錄

點選(此處)摺疊或開啟

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

1.3. 配置

  • 環境變數

點選(此處)摺疊或開啟

  1. [root@master /usr/local/HammerDB-2.23]
  2. #export MYSQL_HOME=/usr/local/mysql/
  3. [root@master /usr/local/HammerDB-2.23]
  4. #echo 'export MYSQL_HOME=/usr/local/mysql/' >> /etc/profile
  5. [root@master /usr/local/HammerDB-2.23]
  6. #export LD_LIBRARY_PATH=/usr/local/HammerDB-2.23/lib/:$MYSQL_HOME/lib
  7. [root@master /usr/local/HammerDB-2.23]
  8. #echo 'export LD_LIBRARY_PATH=/usr/local/HammerDB-2.23/lib/:$MYSQL_HOME/lib' >> /etc/profile
  9. [root@master /usr/local/HammerDB-2.23]
  10. #export PATH=$MYSQL_HOME/bin:$PATH
  11. [root@master /usr/local/HammerDB-2.23]
  12. #echo 'export PATH=$MYSQL_HOME/bin:$PATH' >> /etc/profile
  • 安裝hammerdb GUI依賴包

點選(此處)摺疊或開啟

  1. [root@master /usr/local/HammerDB-2.23]
  2. #yum install libXScrnSaver xorg-x11-fonts* -y
  • 驗證環境變數

點選(此處)摺疊或開啟

  1. [root@master /usr/local/HammerDB-2.23]
  2. #cd /usr/local/HammerDB-2.23/
  3. [root@master /usr/local/HammerDB-2.23]
  4. #ll
  5. total 1512
  6. drwxr-xr-x 2 root 4096 Dec 5 09:29 bin
  7. -rw-r--r-- 1 root 13849 Apr 7 2011 ChangeLog
  8. -rw-r--r-- 1 root 4287 Apr 7 2011 config.xml
  9. -rw-r--r-- 1 root 609 Mar 30 2011 COPYRIGHT
  10. -rw-r--r-- 1 root 18009 Mar 14 2007 hammerora.license
  11. -rwxr--r-- 1 root 38983 Mar 30 2011 hammerora.tcl
  12. drwxr-xr-x 2 root 4096 Dec 5 09:29 hora-components
  13. drwxr-xr-x 2 root 4096 Dec 5 09:29 include
  14. drwxr-xr-x 9 root 4096 Dec 5 09:29 lib
  15. -rw-r--r-- 1 root 608 Mar 30 2011 readme
  16. -rwxr-xr-x 1 root 1434065 Dec 5 09:29 uninstall
  17. [root@master /usr/local/HammerDB-2.23]
  18. #./bin/tclsh8.6
  19. % package require mysqltcl # 檢測環境變數
  20. 3.05 # 這個地方如果正常輸出一個版本號而無報錯,說明環境變數配置生效
  21. % exit # 退出互動視窗
  • PS:如果安裝了sysbench 1.0,則可能報如下錯誤

點選(此處)摺疊或開啟

  1. [root@master /usr/local/HammerDB-2.23]
  2. #./bin/tclsh8.6
  3. % package require mysqltcl
  4. 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)
  5. # 此時,我們把sysbench 1.0中percona的那個依賴包軟鏈去掉,就可以了
  6. [root@master /root]
  7. #locate libmysqlclient.so.18
  8. /home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18
  9. /home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18.1.0
  10. /home/woqu/qdata-dev-env/mysql5.5.25a/lib/libmysqlclient.so.18
  11. /home/woqu/qdata-dev-env/mysql5.5.25a/lib/libmysqlclient.so.18.0.0
  12. /usr/lib64/libmysqlclient.so.18
  13. [root@master /root]
  14. #ll /usr/lib64/libmysqlclient.so.18
  15. lrwxrwxrwx 1 root 22 Nov 1 11:56 /usr/lib64/libmysqlclient.so.18 -> libmysqlclient_r.so.16
  16. [root@master /root]
  17. #unlink /usr/lib64/libmysqlclient.so.18
  18. [root@master /root]
  19. #ln -s /home/mysql/program/mysql-5.6.34-linux-glibc2.5-x86_64/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
  20. # 如果需要使用sysbench 1.0時,重新換一下軟鏈即可,當然,由於這裡我們是使用的MySQL 5.6.x的lib庫,兩者都可以使用,無需換軟鏈
  • 修改配置檔案

    • 所有HammerDB的工作資料都可以在hammerdb介面啟動之後,使用選單選項進行臨時設定。 但是,如果你經常需要做某個測試,希望這些配置持久化而不需要每次都去臨時設定,那麼你可以在HammerDB的工作目錄下名為config.xml的配置檔案中進行設定,該配置檔案將在hammerdb啟動時讀取。 在這個檔案中,您可以通過編輯xml檔案來預設模式構建和驅動程式配置,而無需每次都去臨時手動更改。 如果你的xml檔案格式正確(無格式錯誤),當你在測試過程中選擇對應的選單選項時,你在xml檔案中設定的變數將被應用到HammerDB上,例如(這裡我們只看mysql的tpc-c部分):
  1. [root@master /usr/local/HammerDB-2.23]
  2. #pwd
  3. /usr/local/hammerora-2.6
  4. [root@master /usr/local/HammerDB-2.23]
  5. #cat config.xml
  6. xml version="1.0" encoding="utf-8"?>
  7. ...
  8. Oracle<!--rdbms>
  9. TPC-C<!--bm>
  10. <!--benchmark>
  11. <!--oracle>
  12. 127.0.0.1<!--mysql_host>
  13. 3306<!--mysql_port>
  14. <!--connection>
  15. 128<!--my_count_ware>
  16. 128<!--mysql_num_threads>
  17. hammerdb<!--mysql_user>
  18. hammerdb<!--mysql_pass>
  19. tpcc<!--mysql_dbase>
  20. innodb<!--storage_engine>
  21. false<!--mysql_partition>
  22. <!--schema>
  23. 1000000<!--my_total_iterations>
  24. false<!--my_raiseerror>
  25. false<!--my_keyandthink>
  26. standard<!--mysqldriver>
  27. 2<!--my_rampup>
  28. 5<!--my_duration>
  29. false<!--my_allwarehouse>
  30. false<!--my_timeprofile>
  31. <!--driver>
  32. <!--tpcc>
  33. ...
  34. <!--mysql>
  35. ...
  36. <!--hammerdb>
  • PS:

    • mysql_num_threads設定一定不能比my_count_ware倉庫數量大,否則後面造數會卡在建立儲存過程的地方

    • 生產環境壓測,倉庫建議不少於100個,倉庫數量太少時,併發執行緒數(虛擬使用者數量)增加時,會有大量執行緒因為操作同一行記錄而導致大量鎖等待(基本在commit階段)

    • 生產環境中my_total_iterations中總的迭代查詢量不建議不低於500W,這裡為了快速演示,保留預設的100W

    • 由於hammerdb是GUI介面的,需要使用securecrt或xshell等終端工具配置X11協議轉發,且最好使用終端工具直連安裝hammerdb的伺服器,否則配置起來非常繁瑣

  • 登入待測試的MySQL例項,建立測試賬號




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

1.4. 啟動

  • 啟動hammerdb



  1. [root@master /usr/local/HammerDB-2.23]
  2. #cd /usr/local/HammerDB-2.23/
  3. [root@master /usr/local/HammerDB-2.23]
  4. #./hammerdb.tcl
  • 啟動之後介面如下

  • PS:如果在xshell和securecrt終端啟動報錯,請按照如下連結介紹的方法處理(mac版本的securecrt可能因為部分版本有BUG,無法彈窗,那就用虛擬機器吧,雖然xshell可以彈窗,但是確沒有mac版本)

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命令列客戶端登入資料庫,可以檢視到當前的一些連線程式和資料庫表



  1. mysql> show processlist;
  2. ......
  3. | 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_ |
  4. | 7174 | hammerdb | 10.10.30.14:44067 | tpcc | Sleep | 1 | | NULL |
  5. | 7175 | hammerdb | 10.10.30.14:44068 | tpcc | Sleep | 2 | | NULL |
  6. | 7176 | hammerdb | 10.10.30.14:44069 | tpcc | Sleep | 1 | | NULL |
  7. | 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_ |
  8. | 7178 | hammerdb | 10.10.30.14:44071 | tpcc | Sleep | 1 | | NULL |
  9. +------+----------+-------------------+--------------------+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
  10. 131 rows in set (0.00 sec)
  11. mysql> use tpcc
  12. Reading table information for completion of table and column names
  13. You can turn off this feature to get a quicker startup with -A
  14. Database changed
  15. mysql> show tables;
  16. +----------------+
  17. | Tables_in_tpcc |
  18. +----------------+
  19. | customer |
  20. | district |
  21. | history |
  22. | item |
  23. | new_order |
  24. | order_line |
  25. | orders |
  26. | stock |
  27. | warehouse |
  28. +----------------+
  29. 9 rows in set (0.00 sec)
  • 造數完成之後,可以看到“TPCC SCHEMA COMPLETE”字樣,如下圖

  • schema建立完成之後,我們可以登入資料庫中簡單查詢以下資料(注意:如果以下三個語句任意一個查詢到無結果,說明造數失敗,會導致後續load測試無法進行)



  1. # 查詢表中的資料
  2. mysql use tpcc
  3. Database changed
  4. mysql> select * from warehouse limit 1 \G
  5. *************************** 1. row ***************************
  6. w_id: 1
  7. w_ytd: 3000000.00
  8. w_tax: 0.1700
  9. w_name: QDomcHSyn
  10. w_street_1: hEvTR42ePpREnM
  11. w_street_2: 0JfWR5A2quAudxrLyA
  12. w_city: EzRKodmYv0
  13. w_state: 9l
  14. w_zip: 966011111
  15. 1 row in set (0.00 sec)
  16. # 查詢表中的索引
  17. mysql> show indexes from warehouse \G
  18. *************************** 1. row ***************************
  19. Table: warehouse
  20. Non_unique: 0
  21. Key_name: PRIMARY
  22. Seq_in_index: 1
  23. Column_name: w_id
  24. Collation: A
  25. Cardinality: 10
  26. Sub_part: NULL
  27. Packed: NULL
  28. Null:
  29. Index_type: BTREE
  30. Comment:
  31. Index_comment:
  32. 1 row in set (0.00 sec)
  33. # 查詢儲存過程
  34. mysql> select routine_name from information_schema.routines where routine_schema = 'TPCC';
  35. +--------------+
  36. | routine_name |
  37. +--------------+
  38. | DELIVERY |
  39. | NEWORD |
  40. | OSTAT |
  41. | PAYMENT |
  42. | SLEV |
  43. +--------------+
  44. 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

    • PS:為了方便演示基準測試曲線,我們這裡選擇第一種,如下圖

  • 雙擊左側選單"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使用者的執行緒在執行



  1. mysql show processlist;
  2. ......
  3. | 7302 | hammerdb | 10.10.30.14:44195 | tpcc | Query | 0 | closing tables | COMMIT |
  4. | 7303 | hammerdb | 10.10.30.14:44196 | tpcc | Sleep | 0 | | NULL |
  5. | 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, |
  6. | 7305 | hammerdb | 10.10.30.14:44198 | tpcc | Query | 0 | updating | UPDATE order_line SET ol_delivery_d = timestamp
  7. WHERE ol_o_id = d_no_o_id AND ol_d_id = d_d_id AND
  8. o |
  9. | 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_ |
  10. | 7307 | hammerdb | 10.10.30.14:44200 | tpcc | Sleep | 0 | | NULL |
  11. | 7308 | hammerdb | 10.10.30.14:44201 | tpcc | Query | 0 | NULL | COMMIT |
  12. +------+----------+-------------------+------+---------+------+-------------------+------------------------------------------------------------------------------------------------------+
  13. 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章