全部產品
Search
文件中心

PolarDB:TPC-C測試

更新時間:Mar 22, 2025

本文介紹如何使用TPC-C工具測試PolarDB-X(引擎版本MySQL 5.7和MySQL 8.0)資料庫的聯機交易處理(偏向OLTP)的能力,您可以按照本文的介紹自行測試進行對比,快速瞭解資料庫系統的效能。

背景資訊

TPC-C是業界常用的一套Benchmark,由TPC委員會制定發布,用於評測資料庫的聯機交易處理(偏向OLTP)能力。主要涉及10張表,包含了NewOrder(新訂單的產生)、Payment(訂單付款)、OrderStatus(最近訂單查詢)、Delivery(配送)和StockLevel(庫存缺貨狀態分析)等五類業務事務模型。TPC-C使用tpmC值(Transactions per Minute)來衡量系統最大有效輸送量(MQTh,Max Qualified Throughput),其中Transactions以NewOrder Transaction為準,即最終衡量單位為每分鐘處理的新訂單數。

說明

本文中TPC-C的實現基於TPC-C的基準測試,並不能與發行的TPC-C基準測試結果相比較,本文中的測試並不符合TPC-C基準測試的所有要求。

測試設計

  • 測試資料量

    基於1000 Warehouse,其中主要表的資料量如下:

    • bmsql_order_line表3億行

    • bmsql_stock表1億行

    • bmsql_customer、bmsql_history、bmsql_oorder各3000萬行

  • 測試所用執行個體規格

    節點規格

    節點數

    4C32G

    2

    4C32G

    4

    8C64G

    2

    8C64G

    4

  • 測試所用壓力機規格

    ecs.g6.8xlarge(32 vCPU,128 GB記憶體)

測試方法

  1. 準備壓力機ECS

    準備一個ECS(建議配置為32 vCPU 128 GB記憶體,避免在測試高規格叢集時,壓力機成為瓶頸),後續操作步驟中涉及的資料準備、運行壓測等使用的都是這台ECS機器。

    說明

    測試所用ECS需要部署在VPC網路內。請記錄該VPC的名稱和ID,後續的所有執行個體都將部署在該VPC內。

  2. 準備壓測所用PolarDB-X執行個體

    1. 建立PolarDB-X執行個體(按需選擇引擎版本MySQL 5.7或MySQL 8.0),詳細操作步驟請參見建立執行個體

      說明

      需保證ECS和PolarDB-X執行個體在同一個VPC中。

    2. 在執行個體中建立一個待壓測的資料庫。

      CREATE DATABASE tpcc_1000  MODE = 'auto';
      說明

      本測試中資料庫名為tpcc_1000。

  3. 調整執行個體參數

    說明

    為了在壓測情境下達到最佳效能,需要調整部分PolarDB-X計算層執行個體參數。

    1. 修改參數ENABLE_COROUTINE的值為true,XPROTO_MAX_DN_CONCURRENTXPROTO_MAX_DN_WAIT_CONNECTION的值為4000,詳細操作步驟請參見參數設定

    2. 通過命令列串連到PolarDB-X執行個體,在同一會話內執行如下SQL語句,關閉日誌記錄與CPU採樣統計:

      SET GLOBAL RECORD_SQL=false;
      SET GLOBAL MPP_METRIC_LEVEL=0;
      SET GLOBAL ENABLE_CPU_PROFILE=false;
      SET GLOBAL ENABLE_TRANS_LOG=false;
  4. 準備壓測資料

    1. 準備壓測工具

      下載壓測工具包benchmarksql.tar.gz,並解壓。

      tar xzvf benchmarksql.tar.gz
      說明

      BenchmarkSQL預設不支援MySQL協議,需要進行工具改造適配(此處提供了基於開源BenchmarkSQL 5.0改動後的源碼以及編譯後的JAR包,該JAR包需要JDK8及以上,且相容MySQL 5.7和MySQL 8.0)。

    2. 壓測配置

      在ECS上執行如下命令,修改props.mysql設定檔,並填入對應的PolarDB-X執行個體串連資訊:

      cd benchmarksql/run
      vi props.mysql

      其中, 設定檔以及主要參數解釋如下:

      db=mysql
      driver=com.mysql.jdbc.Driver
      conn=jdbc:mysql://{HOST}:{PORT}/tpcc?readOnlyPropagatesToServer=false&rewriteBatchedStatements=true&failOverReadOnly=false&connectTimeout=3000&socketTimeout=90000&allowMultiQueries=true&clobberStreamingResults=true&characterEncoding=utf8&netTimeoutForStreamingResults=0&autoReconnect=true
      user={USER}
      password={PASSWORD}
      
      warehouses=1000
      loadWorkers=100
      
      terminals=128
      //To run specified transactions per terminal- runMins must equal zero
      runTxnsPerTerminal=0
      //To run for specified minutes- runTxnsPerTerminal must equal zero
      runMins=5
      //Number of total transactions per minute
      limitTxnsPerMin=0
      
      //Set to true to run in 4.x compatible mode. Set to false to use the
      //entire configured database evenly.
      terminalWarehouseFixed=true
      
      //The following five values must add up to 100
      //The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
      newOrderWeight=45
      paymentWeight=43
      orderStatusWeight=4
      deliveryWeight=4
      stockLevelWeight=4
      
      // Directory name to create for collecting detailed result data.
      // Comment this out to suppress.
      resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
      
      // osCollectorScript=./misc/os_collector_linux.py
      // osCollectorInterval=1
      // osCollectorSSHAddr=user@dbhost
      // osCollectorDevices=net_eth0 blk_sda
      • conn:串連串配置,需填入主機名稱{HOST}、連接埠號碼{PORT}

      • user:使用者名稱

      • password:密碼

      • warehouses:倉庫數

      • loadWorkers:匯入資料並發數

      • terminals:壓測並發數

      • runMins:壓測時間

    3. 匯入壓測資料

      在壓力機ECS中執行如下命令匯入壓測資料:

      cd benchmarksql/run/sql.common
      cp tableCreates.sql.auto  tableCreates.sql
      cd ..
      nohup ./runDatabaseBuild.sh props.mysql &
      說明

      預設按照100並發匯入,總共5億多條記錄,整體匯入時間在小時層級,建議通過nohup推到後台運行,避免SSH命令列斷開導致匯入中斷。

    4. 驗證資料完整性

      通過命令列串連到PolarDB-X執行個體執行以下SQL,若返回結果集均為空白,證明資料完整。

      SELECT a.* FROM (SELECT w_id, w_ytd FROM bmsql_warehouse) a LEFT JOIN (SELECT d_w_id, SUM(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) b ON a.w_id = b.d_w_id AND a.w_ytd = b.d_ytd_sum WHERE b.d_w_id IS NULL;
      
      SELECT a.* FROM (SELECT d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT o_w_id, o_d_id, MAX(o_id) AS o_id_max FROM bmsql_oorder GROUP BY  o_w_id, o_d_id) b ON a.d_w_id = b.o_w_id AND a.d_id = b.o_d_id AND a.d_n_o_id = b.o_id_max WHERE b.o_w_id IS NULL;
      
      SELECT a.* FROM (Select d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT no_w_id, no_d_id, MAX(no_o_id) AS no_id_max FROM bmsql_new_order GROUP BY no_w_id, no_d_id) b ON a.d_w_id = b.no_w_id AND a.d_id = b.no_d_id AND a.d_n_o_id = b.no_id_max WHERE b.no_id_max IS NULL;
      
      SELECT * FROM (SELECT (COUNT(no_o_id)-(MAX(no_o_id)-MIN(no_o_id)+1)) AS diff FROM bmsql_new_order GROUP BY no_w_id, no_d_id) a WHERE diff != 0;
      
      SELECT a.* FROM (SELECT o_w_id, o_d_id, SUM(o_ol_cnt) AS o_ol_cnt_cnt FROM bmsql_oorder  GROUP BY o_w_id, o_d_id) a LEFT JOIN (SELECT ol_w_id, ol_d_id, COUNT(ol_o_id) AS ol_o_id_cnt FROM bmsql_order_line GROUP BY ol_w_id, ol_d_id) b ON a.o_w_id = b.ol_w_id AND a.o_d_id = b.ol_d_id AND a.o_ol_cnt_cnt = b.ol_o_id_cnt WHERE b.ol_w_id IS NULL;
      
      SELECT a.* FROM (SELECT d_w_id, SUM(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) a LEFT JOIN (Select w_id, w_ytd FROM bmsql_warehouse) b ON a.d_w_id = b.w_id AND a.d_ytd_sum = b.w_ytd WHERE b.w_id IS NULL;
  5. 執行壓測

    執行如下命令運行TPC-C測試:

    cd benchmarksql/run
    ./runBenchmark.sh props.mysql

    運行後可以看到即時的tpmC數值,運行結束後會顯示平均的tpmC數值。

    [2024/07/16 16:32:20.369] Average tpmC: 286806.15 Current tpmC: 290244.00 Memory Usage: 510MB / 3584MB
    [2024/07/16 16:32:25.369] Average tpmC: 286821.77 Current tpmC: 287712.00 Memory Usage: 209MB / 3584MB
    [2024/07/16 16:32:30.369] Average tpmC: 286855.77 Current tpmC: 288828.00 Memory Usage: 984MB / 3584MB
    [2024/07/16 16:32:35.370] Average tpmC: 286852.69 Current tpmC: 286682.66 Memory Usage: 653MB / 3584MB
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00,
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 286841.81
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, Measured tpmTOTAL = 637027.51
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00,
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, Session Start = 2024-07-16 16:27:35
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, Session End = 2024-07-16 16:32:35
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, Transaction Count = 3186400

測試結果

引擎版本MySQL 5.7

說明

版本號碼:polardb-2.4.0_5.4.19-20240610_xcluster5.4.19-20240527,詳情請參見:版本發布說明

image

規格

64並發

128並發

256並發

512並發

1024並發

4C32G*2

75655.51

96178.92

99315.74

98272.41

91849.33

4C32G*4

103698.48

160964.59

191213.08

196013.09

194955.2

8C64G*2

92608.23

128178.78

141578.84

138943.08

132062.62

8C64G*4

106394.6

191550.55

269927.62

292926.91

286841.81

引擎版本MySQL 8.0

說明

版本號碼:polardb-2.4.0_5.4.19-20240610_xcluster8.4.19-20240523,詳情請參見:版本發布說明

image

規格

64並發

128並發

256並發

512並發

1024並發

4C32G*2

63102.89

80591.88

80843.53

76747.57

70397.38

4C32G*4

78316.27

118637.24

149567.59

151138.05

150177.41

8C64G*2

81533.11

109978.06

118902.41

115632.36

110539.75

8C64G*4

99772.56

155959.31

211403.16

221496.06

212633.02