BenchmarkSQL資料庫基準測試工具
之前有介紹過sysbench基準測試工具,類似的開源測試工具還有BenchmarkSQL,一個JDBC基準測試工具,內嵌了TPC-C測試指令碼,也支援很多資料庫,如PostgreSQL、Oracle和Mysql等。
1、軟體環境
- 系統用CentOS7
- Java,因為BenchmarkSQL本身是使用Java語言編寫的,所以如果在Linux系統下還沒有安裝JDK的話,我們首先需要對其進行安裝
- 資料庫,本例先介紹PostgreSQL和Mysql
- Ant,用來對BenchmarkSQL進行編譯
- EPEL倉庫
- R語言,用來生成圖形報告
以及上述軟體的依賴。
2、安裝過程
2.1、安裝ant
yum -y install ant
2.2、安裝EPEL倉庫
- 安裝
su -c 'rpm -Uvh https://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm'
- 更新
yum -y update
2.3、安裝R語言
yum -y install R
2.4、安裝BenchmarkSQL
-
在下載地址中下載所需的包,上傳至伺服器後完成解壓:
unzip ./benchmarksql-5.0.zip
-
進入解壓後的目錄用ant編譯
cd benchmarksql
ant
此時會編譯出一個版本 benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar,但是該版本並不支援MySQL的TPC-C測試,需要做如下的修改。-
修改benchmarksql原始碼
(1)修改benchmarksql-5.0/src/client/jTPCC.java,增加mysql相關部分,如下所示:if (iDB.equals("firebird")) dbType = DB_FIREBIRD; else if (iDB.equals("oracle")) dbType = DB_ORACLE; else if (iDB.equals("postgres")) dbType = DB_POSTGRES; else if (iDB.equals("mysql")) dbType = DB_UNKNOWN; else { log.error("unknown database type '" + iDB + "'"); return; }
(2)修改benchmarksql-5.0/src/client/jTPCCConnection.java, SQL子查詢增加"AS L"別名,如下所示:
default: stmtStockLevelSelectLow = dbConn.prepareStatement( "SELECT count(*) AS low_stock FROM (" + " SELECT s_w_id, s_i_id, s_quantity " + " FROM bmsql_stock " + " WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN (" + " SELECT ol_i_id " + " FROM bmsql_district " + " JOIN bmsql_order_line ON ol_w_id = d_w_id " + " AND ol_d_id = d_id " + " AND ol_o_id >= d_next_o_id - 20 " + " AND ol_o_id < d_next_o_id " + " WHERE d_w_id = ? AND d_id = ? " + " ) " + " )AS L"); break;
-
重新編譯修改後的原始碼,此時得到的benchmarksql版本 benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar 已經支援MySQL的TPC-C測試。
cd benchmarksql-5.0
ant
-
修改相關指令碼,支援Mysql
(1)修改 檔案:benchmarksql-5.0/run/funcs.sh,新增mysql 資料庫型別。function setCP() { case "$(getProp db)" in firebird) cp="../lib/firebird/*:../lib/*" ;; oracle) cp="../lib/oracle/*" if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then cp="${cp}:${ORACLE_HOME}/lib/*" fi cp="${cp}:../lib/*" ;; postgres) cp="../lib/postgres/*:../lib/*" ;; mysql) cp="../lib/mysql/*:../lib/*" ;; esac myCP=".:${cp}:../dist/*" export myCP } ...省略 case "$(getProp db)" in firebird|oracle|postgres|mysql) ;; "") echo "ERROR: missing db= config option in ${PROPS}" >&2 exit 1 ;; *) echo "ERROR: unsupported database type 'db=$(getProp db)' in ${PROPS}" >&2 exit 1 ;; esac
(2)新增mysql java connector驅動,下載對應版本的驅動,官網下載地址,如8.0以上版本下載對應的驅動mysql-connector-java-8.0.18.jar 需自行下載。
mkdir -p benchmarksql-5.0/lib/mysql
cp mysql-connector-java-8.0.18.jar benchmarksql-5.0/lib/mysql/
(3)修改benchmarksql-5.0/run/runDatabaseBuild.sh,去掉extraHistID
AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish"
修改為:
AFTER_LOAD="indexCreates foreignKeys buildFinish"
-
2.5、配置測試引數檔案
- 配置
cd run
cp props.pg postgres.properties
cp props.pg mysql.properties
vim postgres.properties
vim mysql.properties
- 配置檔案詳解:
- db=postgres //資料庫型別,postgres,mysql
- driver=org.postgresql.Driver //驅動,mysql8.0以上為com.mysql.cj.jdbc.Driver
- conn=jdbc:postgresql://localhost:5432/postgres //PG資料庫連線字串,正常情況下,需要更改localhost為對應PG服務IP、5432位對應PG服務埠、postgres為對應測試資料庫名
- user=benchmarksql //資料庫使用者名稱,通常建議用預設,這就需要我們提前在資料庫中建立benchmarksql使用者
- password=PWbmsql //如上使用者密碼
- warehouses=1 //倉庫數量,數量根據實際伺服器記憶體配置,配置方法見第3步
- loadWorkers=4 //用於在資料庫中初始化資料的載入程序數量,預設為4,實際使用過程中可以根據實際情況調整,載入速度會隨worker數量的增加而有所提升
- terminals=1 //終端數,即併發客戶端數量,通常設定為CPU執行緒總數的2~6倍
- runTxnsPerTerminal=10 //每個終端(terminal)執行的固定事務數量,例如:如果該值設定為10,意味著每個terminal執行10個事務,如果有32個終端,那整體執行320個事務後,測試結束。該引數配置為非0值時,下面的runMins引數必須設定為0
- runMins=0 //要測試的整體時間,單位為分鐘,如果runMins設定為60,那麼測試持續1小時候結束。該值設定為非0值時,runTxnsPerTerminal引數必須設定為0。這兩個引數不能同時設定為正整數,如果設定其中一個,另一個必須為0,主要區別是runMins定義時間長度來控制測試時間;runTxnsPerTerminal定義事務總數來控制時間。
- limitTxnsPerMin=300 //每分鐘事務總數限制,該引數主要控制每分鐘處理的事務數,事務數受terminals引數的影響,如果terminals數量大於limitTxnsPerMin值,意味著併發數大於每分鐘事務總數,該引數會失效,想想也是如此,如果有1000個併發同時發起,那每分鐘事務數設定為300就沒意義了,上來就是1000個併發,所以要讓該引數有效,可以設定數量大於併發數,或者讓其失效,測試過程中目前採用的是預設300。
- terminalWarehouseFixed=true //終端和倉庫的繫結模式,設定為true時可以執行4.x相容模式,意思為每個終端都有一個固定的倉庫。設定為false時可以均勻的使用資料庫整體配置。TPCC規定每個終端都必須有一個繫結的倉庫,所以一般使用預設值true。
- //下面五個值的總和必須等於100,預設值為:45, 43, 4, 4 & 4 ,與TPC-C測試定義的比例一致,實際操作過程中,可以調整比重來適應各種場景。
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4 - resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS //測試資料生成目錄,預設無需修改,預設生成在run目錄下面,名字形如my_result_xxxx的資料夾。
- osCollectorScript=./misc/os_collector_linux.py //作業系統效能收集指令碼,預設無需修改,需要作業系統具備有python環境
- osCollectorInterval=1 //作業系統收集操作間隔,預設為1秒
- //osCollectorSSHAddr=user@dbhost //作業系統收集所對應的主機,如果對本機資料庫進行測試,該引數保持登出即可,如果要對遠端伺服器進行測試,請填寫使用者名稱和主機名。
- osCollectorDevices=net_eth0 blk_sda //作業系統中被收集伺服器的網絡卡名稱和磁碟名稱,例如:使用ifconfig檢視作業系統網絡卡名稱,找到測試所走的網絡卡,名稱為enp1s0f0,那麼下面網絡卡名設定為net_enp1s0f0(net_字首固定);使用df -h檢視資料庫資料目錄,名稱為(/dev/sdb 33T 18T 16T 54% /hgdata),那麼下面磁碟名設定為blk_sdb(blk_字首固定)
2.6、進行測試
執行當前路徑下的shell指令碼:
./runDatabaseBuild.sh my_postgres.properties
./runBenchmark.sh my_postgres.properties
[NOTE]
測試之前要在資料庫中建立相應的database和user,還要注意許可權的問題。
2.7、結果處理
測試結束後,run目錄下會生成一個新目錄,它的命名格式為 my_result_%tY-%tm-%td_%tH%tM%tS。
使用 generateReport.sh my_result_* 指令碼建立具有圖形的 HTML 檔案:
例如:
./generateReport.sh my_result_2018-09-30_133047