全部產品
Search
文件中心

PolarDB:TPC-C測試說明

更新時間:Jul 06, 2024

本文介紹如何使用TPC-C工具測試PolarDB-X 1.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基準測試的所有要求。

測試設計

  • 測試資料量
    • 針對普通執行個體效能測試,TPC-C測試結果主要基於1000 Warehouse,其中主要的表資料量如下:
      • bmsql_order_line 3億行
      • bmsql_stock 1億行
      • bmsql_customer、bmsql_history、bmsql_oorder各3000萬行
    • 為了驗證PolarDB-X 1.0的水平擴充能力,還引入了超大規格執行個體的TPC-C測試,相比於普通執行個體擴充了近10倍的資源。在超大規格壓測設計上,構建了10000 Warehouse,同時TPC-C施壓機需要增加到3台32核的ECS機器,避免壓測本身成為了瓶頸點。
  • 測試所用執行個體規格
    • 企業版測試環境:PolarDB-X 1.0計算資源執行個體企業版32核128 GB(單節點16核64 GB)、4台RDS MySQL 5.7執行個體(8核32 GB獨享型)。
    • 標準版測試環境:PolarDB-X 1.0計算資源執行個體標準版16核64 GB(單節點8核32 GB)、4台RDS MySQL 5.7執行個體(4核32 GB獨享型)。
    • 超大規格測試環境:PolarDB-X 1.0計算資源執行個體企業版256核1024 GB(單節點16核64 GB)、12台RDS MySQL 5.7執行個體(32核128 GB獨享型)。

測試方法

  • 步驟1:準備壓力機ECS
    需準備一個ECS,後續操作步驟中涉及的資料準備、運行壓測等使用的都是這台ECS機器。
    說明 建議將測試所用ECS部署在VPC網路內(如選擇傳統網路可能出現RDS某些規格沒有庫存的情況)。請記住該VPC的名稱和ID,後續的所有執行個體都將部署在該VPC內。
  • 步驟2:準備壓測所用PolarDB-X 1.0執行個體
    1. 建立PolarDB-X 1.0執行個體,詳細操作步驟請參見建立PolarDB-X 1.0執行個體
    2. 在執行個體中建立一個待壓測的資料庫(本測試中資料庫名為tpcc,詳細操作步驟請參見建立資料庫)。
    說明 需保證ECS和PolarDB-X 1.0在同一個VPC中。
  • 步驟3:壓測資料準備
    1. 準備壓測工具
      說明
      • 本文使用開源的BenchmarkSQL 5.0進行TPC-C測試。
      • BenchmarkSQL預設不支援MySQL協議,需要進行工具改造適配。
      1. 下載改造好的壓測包tpcc.tar.gz,並在ECS中執行如下命令將其解壓到tpcc目錄:
        mkdir tpcc 
        tar zxvf tpcc.tar.gz -C tpcc        
      2. 按如下說明修改壓縮包內的對應檔案:
        src/client/jTPCC.java(增加一個MySQL的type)
        src/client/jTPCCConnection.java(支援MySQL的文法,加一個別名)
        src/LoadData/LoadData.java(關閉loader資料時的大事務機制)
        src/LoadData/LoadDataWorker.java(關閉loader資料時的大事務機制)
        run/funcs.sh(指令碼增加一個MySQL的type)
        run/runDatabaseBuild.sh(去掉不必要的階段)
        run/runBenchmark.sh(調整預設jvm參數)
        run/runLoader.sh(調整預設jvm參數)
        run/sql.common/foreignKeys.sql (注釋全部外鍵建立,PolarDB-X 1.0不支援外鍵)
        run/sql.common/indexCreates.sql (注釋掉全部主鍵建立,只留2個索引建立,MySQL預設在建表時直接建立索引)
        run/sql.common/indexDrops.sql(注釋全部主鍵刪除)
        run/sql.common/tableCreates.sql(添加主鍵和拆分鍵,PolarDB-X 1.0需要指定拆分鍵)
        設定檔以及主要參數的說明如下:
        // --------- env config --------- // 
        db=mysql
        driver=com.mysql.jdbc.Driver
        conn=jdbc:mysql://drdsxxxx:3306/tpcc?
        useSSL=false&useServerPrepStmts=false&useConfigs=maxPerformance&rewriteBatchedStatements=true
        user=tpcc
        password=tpcc
        
        // warehouse 數量
        warehouses=1000
        // 匯入資料的並發數,每100並發預計產生2萬TPS,可以結合目標TPS能力調整並發
        // runLoader.sh的jvm記憶體,100並發預設為4 GB,500並發建議設定為16 GB
        loadWorkers=100
        
        // TPC-C壓測並發數
        terminals=1000
        // 壓測時間,單位分鐘
        runMins=10
        // ---------- default config ------- //
        //To run specified transactions per terminal- runMins must equal zero
        runTxnsPerTerminal=0
        //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
        說明
        • 匯入壓測資料時,需要關注warehouses(倉庫數)和loadWorkers(並發數)。
        • TPC-C壓測時,需要關注terminals(並發數)和runMins(已耗用時間)。
    2. 壓測執行
      1. 在ECS中執行如下命令準備壓測資料:
        cd tpcc/run
        nohup ./runDatabaseBuild.sh props.mysql &
        說明 預設按照100並發匯入,總共5億多記錄,整體匯入時間在小時層級,建議通過nohup推到後台運行,避免ssh命令列斷開導致匯入中斷。
      2. 執行如下命令運行TPC-C測試:
        cd tpcc/run
        ./runBenchmark.sh props.mysql
        運行之後可以看到如下測試結果:
        08:56:16,844 [Thread-883] INFO   jTPCC : Term-00, Measured tpmC (NewOrders) = 104230.88
        08:56:16,844 [Thread-883] INFO   jTPCC : Term-00, Measured tpmTOTAL = 231664.49
        08:56:16,844 [Thread-883] INFO   jTPCC : Term-00, Session Start     = 2019-09-19 08:54:16
        08:56:16,845 [Thread-883] INFO   jTPCC : Term-00, Session End       = 2019-09-19 08:56:16
        08:56:16,845 [Thread-883] INFO   jTPCC : Term-00, Transaction Count = 465440
        說明 tpmC值即為對應壓測情境下的結果。更多測試結果詳情,請參見測試結果
      3. 執行如下命令清理壓測資料:
        cd tpcc/run
        ./runDatabaseDestroy.sh props.mysql

測試結果

並發度標準版執行個體tpmC企業版執行個體tpmC超大規格執行個體tpmC
1個用戶端x 1000並發65,735.14101,620.8/
6個用戶端x 1000並發//821,547.97