之前有介紹過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 runcp props.pg postgres.propertiescp props.pg mysql.propertiesvim postgres.propertiesvim 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
