工具| benchmarksql使用指南

語言: CN / TW / HK

一 前言

BenchmarkSQL是一款經典的開源數據庫測試工具,其包含 TPCC 測試腳本,支持MySQL、Oracle 、EnterpriseDB、PostgreSQL以及SQL Server 等數據庫的性能壓力測試。本文介紹 基於 Linux 系統安裝 benchmark-5.1 版本 並且測試 postgresql。

二  實踐

2.1 下載

  1. 從github 直接下載源碼進行編譯安裝

    git clone https://github.com/petergeoghegan/benchmarksql
    
  2. 安裝ant 編譯工具

    yum install -y ant
    

還有一種是直接從官網下載zip安裝包,直接解壓縮即可。

2.2 安裝

鑑於 BenchmarkSQL 是使用Java語言開發的,所以在安裝壓測工具之前,必須先安裝JDK 並且配置JAVA 環境變量

PATH=$PATH:$HOME/bin:/usr/local/polardb_o_current/bin
JAVA_HOME=/usr/local/jdk1.8.0_111
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

將對應的數據庫驅動配置到 /path/benchmarksql-5.1/lib/ 目錄下,比如要針對pg進行壓測,需要將驅動放到 /path/benchmarksql-5.1/lib/postgres

2.3 配置

配置文件

//數據庫類型,postgres
db=postgres
//驅動程序,每種數據庫有對應的驅動
driver=org.postgresql.Driver
conn= jdbc:postgresql//127.0.0.1:5444/benchmark
user=benchmark
password=benchmark
//倉庫數量
warehouses=4
//初始化數據的加載進程數量,默認為4,實際使用可以結合os性能做配置
loadWorkers=4
//終端數,即併發客户端數量,通常設置為CPU線程總數的2~6倍
terminals=4

//每個終端運行的固定事務數量,如該值為10, 則每個terminal運行10個事務,如果有32個終端,那整體運行320個事務後,測試結束。該參數配置為非0值時,下面的runMins參數必須設置為0。
runTxnsPerTerminal=0
//runMins表示要壓測的時間長度,單位為分鐘。該值為非0值時,runTxnsPerTerminal參數必須設置為0。這兩個參數不能同時設置為正整數,如果設置其中一個,另一個必須為0,主要區別是runMins定義時間長度來控制測試時間;runTxnsPerTerminal定義事務總數來控制時間。
runMins=5
//Number of total transactions per minute
limitTxnsPerMin=0

//終端和倉庫的綁定模式,設置為true時可以運行4.x兼容模式,意思為每個終端都有一個固定的倉庫。設置為false時可以均勻的使用數據庫整體配置。TPCC規定每個終端都必須有一個綁定的倉庫,所以一般使用默認值true
terminalWarehouseFixed=true

//下面五個值的總和必須等於100,默認值為:45, 43, 4, 4,4 ,與TPC-C測試定義的比例一致,實際操作過程中,可以調整比重來適應各種場景。
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

測試過程中的整體邏輯通過一個例子來説明:

  1. 假如limitTxnsPerMin參數使用默認300,termnals終端數量設置為150併發,實際會計算一個值A=limitTxnsPerMin/terminals=2(此處需要注意,A為int類型,如果terminals的值大於limitTxnsPerMin,得到的A值必然為0,為0時該參數失效),此處記住A=2;

  2. 接下來,在整個測試運行過程中,軟件會記錄一個事務的開始時間和結束時間,假設為B=2000毫秒;

  3. 然後用60000 ms除以A得到一個值C=60000/2=30000,假如事務運行時間B<C,那麼該事務執行完後,sleep C-B秒再開啟下一個事務;假如B>C,意味着事務超過了預期時間,那麼馬上進行下一個事務。在本例子中,每分鐘300個事務,設置了150個併發,每分鐘執行2個併發,每個併發執行2秒鐘完成,每個併發sleep 28秒,這樣可以保證一分鐘有兩個併發,反推回來整體併發數為300/分鐘。

2.4 壓測

benchmarksql 其實和 sysbench 使用方法類似,先生成壓測數據,然後壓測 ,收尾的時候。

生成數據

sh runDatabaseBuild.sh props.polar

該操作會生成10個表 和一個sequence 

壓測

./runBenchmark.sh props.polar
+-------------------------------------------------------------+
00:59:23,752 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.1devel
00:59:23,752 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
00:59:23,752 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
00:59:23,752 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
00:59:23,754 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
00:59:23,754 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
00:59:23,754 [main] INFO jTPCC : Term-00,
00:59:23,755 [main] INFO jTPCC : Term-00, db=postgres
00:59:23,755 [main] INFO jTPCC : Term-00, driver=com.aliyun.polardb.Driver
00:59:23,755 [main] INFO jTPCC : Term-00, conn=jdbc:polardb://127.0.0.1:5444/benchmark
00:59:23,755 [main] INFO jTPCC : Term-00, user=benchmark
00:59:23,755 [main] INFO jTPCC : Term-00,
00:59:23,755 [main] INFO jTPCC : Term-00, warehouses=4
00:59:23,755 [main] INFO jTPCC : Term-00, terminals=4
00:59:23,757 [main] INFO jTPCC : Term-00, runMins=5
00:59:23,757 [main] INFO jTPCC : Term-00, limitTxnsPerMin=0
00:59:23,757 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
00:59:23,758 [main] INFO jTPCC : Term-00, useStoredProcedures=null
00:59:23,758 [main] INFO jTPCC : Term-00,
00:59:23,758 [main] INFO jTPCC : Term-00, newOrderWeight=45
00:59:23,758 [main] INFO jTPCC : Term-00, paymentWeight=43
00:59:23,758 [main] INFO jTPCC : Term-00, orderStatusWeight=4
00:59:23,758 [main] INFO jTPCC : Term-00, deliveryWeight=4
00:59:23,758 [main] INFO jTPCC : Term-00, stockLevelWeight=4
00:59:23,758 [main] INFO jTPCC : Term-00,
00:59:23,758 [main] INFO jTPCC : Term-00, resultDirectory=null
00:59:23,758 [main] INFO jTPCC : Term-00, osCollectorScript=null
00:59:23,758 [main] INFO jTPCC : Term-00,
00:59:23,874 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 165
00:59:23,875 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 237
00:59:23,875 [main] INFO jTPCC : Term-00,
Term-00, Running Average tpmTOTAL: 37572.94 Current tpmTOTAL: 1239168 Memory Usage: 787MB / 1042MB
01:04:24,135 [Thread-2] INFO jTPCC : Term-00,
01:04:24,135 [Thread-2] INFO jTPCC : Term-00,
01:04:24,135 [Thread-2] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 16982.49
01:04:24,135 [Thread-2] INFO jTPCC : Term-00, Measured tpmTOTAL = 37572.67
01:04:24,135 [Thread-2] INFO jTPCC : Term-00, Session Start = 2021-10-17 00:59:24
01:04:24,135 [Thread-2] INFO jTPCC : Term-00, Session End = 2021-10-17 01:04:24
01:04:24,135 [Thread-2] INFO jTPCC : Term-00, Transaction Count = 187868

結果解釋

Running Average tpmTOTAL:每分鐘平均執行事務數(所有事務)

Memory Usage:客户端內存使用情況

Measured tpmC (NewOrders) :每分鐘執行的事務數(只統計NewOrders事務)

Transaction Count:執行的交易總數量

刪除數據

./runDatabaseDestroy.sh props.polar

2.5  報告解析和生成html報告

benchmarksql 除了提供文字版輸出, 還有 通過工具生成 html版本的報告 ,不過需要安裝R語言和提前配置

resultDirectory=poc_%tY-%tm-%td_%tH%tM%tS 壓測結束之後,使用命令

sh generateReport.sh  poc_2021-10-17_191525

其中 poc_2021-10-17_191525 為 報告的路徑。比如此次測試的案例的結果如下:

三 總結

工欲善其事必先利其器,不過工具只是其中的一部分,性能優化的路還很長,還需要結合OS系統網絡,cpu,io ,db系統整體進行調優。