1. 程式人生 > 實用技巧 >BenchmarkSQL資料庫基準測試工具

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