すべてのプロダクト
Search
ドキュメントセンター

PolarDB:TPC-Cテスト

最終更新日:Aug 16, 2024

このトピックでは、Transaction Processing Performance Council Benchmark C (TCP-C) テストを使用して、MySQL 5.7またはMySQL 8.0データベースエンジンを実行するPolarDB-Xインスタンスのオンライントランザクション処理 (OLTP) 機能を測定する方法について説明します。 このトピックで説明されているテスト手順に従って、データベースのパフォーマンスを評価できます。

背景情報

TPC-Cは、データベースのOLTP機能を評価するために広く使用されているベンチマークです。 これは、Transaction Processing Performance Council (TPC) によって開発およびリリースされています。 TPC-Cには、次の5つのトランザクションタイプの10のテーブルが含まれます。新しい注文生成のためのNewOrder、注文支払いのための支払い、注文ステータスクエリのためのOrderStatus、注文配送のためのDelivery、および在庫分析のためのStockLevel。 TPC-Cは、1分あたりのトランザクションC (tpmC) を使用して、システムの最大適格スループット (MQTh) を測定します。 測定値は、1分あたりに処理されるNewOrderトランザクションの数に基づいています。

説明

このトピックで説明するTPC-Cのパフォーマンステストは、TPC-Cのベンチマークテストに基づいて実装されますが、ベンチマークテストのすべての要件を満たすことはできません。 したがって、このトピックのテスト結果は、TPC-Cのベンチマークテストの公開結果と比較することはできません。

テストデザイン

  • 量のテストデータ

    テストは1,000の倉庫に基づいて実行されます。 次のリストは、各メジャーテーブルのデータ量を示しています。

    • bmsql_order_lineテーブルには、300万行のデータが含まれます。

    • bmsql_stockテーブルには、100万行のデータが含まれます。

    • bmsql_customer、bmsql_history、およびbmsql_oorderテーブルには、それぞれ30万行のデータが含まれています。

  • テストのインスタンス仕様

    ノード仕様

    ノード数

    4C32G

    2

    4C32G

    4

    8C64G

    2

    8C64G

    4

  • ストレステスト用ECSインスタンスタイプ

    ecs.g6.8xlarge (32 vCPU、128 GBのメモリ)

手順

  1. ストレステスト用のElastic Compute Service (ECS) インスタンスを作成します。

    データの準備とストレステストの実行に使用されるECSインスタンスを作成します。 高仕様のPolarDB-Xインスタンスをテストする際のパフォーマンスのボトルネックを防ぐため、32 vCPUと128 GBのメモリを備えたECSインスタンスを作成することを推奨します。

    説明

    ECSインスタンスは、仮想プライベートクラウド (VPC) にデプロイする必要があります。 後で使用するために、VPCの名前とIDを記録します。 後続の手順で説明するすべてのデータベースインスタンスをVPCにデプロイする必要があります。

  2. ストレステスト用のPolarDB-Xインスタンスを作成します。

    1. PolarDB-Xインスタンスを作成します。 ビジネス要件に基づいて、MySQL 5.7またはMySQL 8.0データベースエンジンを選択します。 PolarDB-Xインスタンスの作成方法については、「PolarDB-Xインスタンスの作成」をご参照ください。

    2. PolarDB-Xインスタンスでテストするデータベースを作成します。 この例では、tpcc_1000という名前のデータベースが作成されます。 詳細については、「データベースの作成」をご参照ください。

      CREATE DATABASE tpcc_1000;
    説明

    ECSインスタンスとPolarDB-Xインスタンスが同じVPCにあることを確認します。

  3. インスタンスパラメーターの変更

    説明

    ストレステストで最適なパフォーマンスを実現するには、PolarDB-Xインスタンスの計算ノードの特定のパラメーターを変更します。

    1. ENABLE_COROUTINEパラメーターをtrueに設定し、XPROTO_MAX_DN_CONCURRENTパラメーターとXPROTO_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はMySQLプロトコルをサポートしていません。 MySQLプロトコルをサポートするには、BenchmarkSQLをコンパイルする必要があります。 この例では、オープンソースのBenchmarkSQL 5.0をTPC-Cテストツールとして使用しています。

      パッケージbenchmarksql.tar.gzをダウンロードし、パッケージをECSインスタンスにアップロードしてから、次のコマンドを実行してパッケージを解凍します。

      tar xzvf benchmarksql.tar.gz
    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: PolarDB-Xインスタンスへの接続に使用される接続文字列。 {HOST} および {PORT} フィールドの値を指定する必要があります。

      • user: PolarDB-Xインスタンスへのログインに使用されるユーザー名。

      • password: PolarDB-Xインスタンスへのログインに使用されるユーザー名のパスワード。

      • 倉庫: 倉庫の数。

      • loadWorkers: データのインポートに使用される同時loadWorkersの数。

      • terminals: TPC-Cストレステストの同時端子の数。

      • runMins: ストレステストの期間。 単位は分です。

    3. ストレステストデータをインポートします。

      ECSインスタンスで次のコマンドを実行し、ストレステストデータをインポートします。

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

      既定では、100の同時loadWorkerは500万行を超えるデータのインポートに使用されます。 データのインポートには数時間かかります。 SSHの切断によりタスクが中断されないように、nohupを使用してバックグラウンドでインポートタスクを実行することを推奨します。

    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 17:00:05.845] Average tpmC: 306979.98 Current tpmC: 308052.00 Memory Usage: 661MB / 3584MB
    [2024/07/16 17:00:10.845] Average tpmC: 307029.91 Current tpmC: 309876.00 Memory Usage: 1024MB / 3584MB
    [2024/07/16 17:00:15.845] Average tpmC: 307111.09 Current tpmC: 311820.00 Memory Usage: 429MB / 3584MB
    [2024/07/16 17:00:20.846] Average tpmC: 307108.95 Current tpmC: 306982.60 Memory Usage: 780MB / 3584MB
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 307058.27
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00, Measured tpmTOTAL = 681928.39
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00, Transaction Count = 3411539
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00,
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00,
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00, Session Start = 2024-07-16 16:55:20
    17:00:21,011 [Thread-508] INFO jTPCC : Term-00, Session End = 2024-07-16 17:00:21

結果

MySQL 5.7

説明

バージョン: polardb-2.4.0_5.4.19-20240610_xcluster5.4.19-20240527。 詳細については、「リリースノート」をご参照ください。

image

インスタンス仕様

tpmC for 64 concurrent terminals

tpmC for 128 concurrent terminals

tpmC for 256 concurrent terminals

tpmC for 512 concurrent terminals

tpmC for 1024 concurrent terminals

4C32G × 2

91,858.36

107,268.04

108,894.07

106,442.37

98,404.9

4C32G × 4

117,329.67

178,425.44

206,076.83

210,437.44

209,218.11

8C64G × 2

106,817.2

145,097.95

156,306.53

152,141.55

138,043.88

8C64G × 4

117,888.5

208,051.75

296,975.34

316,085.12

307,058.28

MySQL 8.0

説明

バージョン: polardb-2.4.0_5.4.19-20240610_xcluster8.4.19-20240523。 詳細については、「リリースノート」をご参照ください。

image

インスタンス仕様

tpmC for 64 concurrent terminals

tpmC for 128 concurrent terminals

tpmC for 256 concurrent terminals

tpmC for 512 concurrent terminals

tpmC for 1024 concurrent terminals

4C32G × 2

71,546.19

88,074.26

85,959.83

79,893.78

67,109.97

4C32G × 4

88,000.71

133,363.91

166,959.56

166,549.16

158,594.61

8C64G × 2

89,677.54

118,498.21

117,536.04

114,574.98

101,338.24

8C64G × 4

101,735.81

171,088.45

240,313.94

236,207.55

203,671.55