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

PolarDB:TPC-C テスト

最終更新日:Mar 22, 2025

このトピックでは、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、注文支払い用の Payment、注文ステータス問い合わせ用の OrderStatus、注文配送用の Delivery、および在庫分析用の StockLevel です。TPC-C は、1 分あたりのトランザクション数 C(tpmC)を使用して、システムの最大適格スループット(MQTh)を測定します。測定は、1 分あたりに処理される NewOrder トランザクションの数に基づいています。

説明

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

テスト設計

  • テストデータの量

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

    • bmsql_order_line テーブルには、3 億行のデータが含まれています。

    • bmsql_stock テーブルには、1 億行のデータが含まれています。

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

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

    インスタンスの仕様

    ノード数

    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 インスタンスを作成する」をご参照ください。

      説明

      ECS インスタンスと PolarDB-X インスタンスが同じ VPC にあることを確認してください。

    2. PolarDB-X インスタンスでテストするデータベースを作成します。この例では、tpcc_1000 という名前のデータベースが作成されます。

      CREATE DATABASE tpcc_1000  MODE = 'auto';
  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.tar.gz をダウンロードして解凍します。

      tar xzvf benchmarksql.tar.gz
      説明

      デフォルトでは、BenchmarkSQL は MySQL プロトコルをサポートしていません。MySQL プロトコルをサポートするように BenchmarkSQL をコンパイルする必要があります。この例では、オープンソースの BenchmarkSQL 5.0 を TPC-C テストツールとして使用します。JDK 8 以降が必要で、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: PolarDB-X インスタンスへの接続に使用する接続文字列。{HOST} フィールドと {PORT} フィールドの値を指定する必要があります。

      • user: PolarDB-X インスタンスにログインするために使用するユーザー名。

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

      • warehouses: 倉庫の数。

      • 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 個の同時 loadWorkers を使用して、5 億行を超えるデータをインポートします。データのインポートには数時間かかります。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 16:32:20.369] 平均 tpmC: 286806.15 現在の tpmC: 290244.00 メモリ使用量: 510MB / 3584MB
    [2024/07/16 16:32:25.369] 平均 tpmC: 286821.77 現在の tpmC: 287712.00 メモリ使用量: 209MB / 3584MB
    [2024/07/16 16:32:30.369] 平均 tpmC: 286855.77 現在の tpmC: 288828.00 メモリ使用量: 984MB / 3584MB
    [2024/07/16 16:32:35.370] 平均 tpmC: 286852.69 現在の tpmC: 286682.66 メモリ使用量: 653MB / 3584MB
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00,
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, 測定された tpmC (NewOrders) = 286841.81
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, 測定された tpmTOTAL = 637027.51
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00,
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, セッション開始 = 2024-07-16 16:27:35
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, セッション終了 = 2024-07-16 16:32:35
    16:32:35,487 [Thread-714] INFO jTPCC : Term-00, トランザクション数 = 3186400

テスト結果

MySQL 5.7

説明

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

image

インスタンスの仕様

64 同時ターミナルの tpmC

128 同時ターミナルの tpmC

256 同時ターミナルの tpmC

512 同時ターミナルの tpmC

1024 同時ターミナルの tpmC

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 同時ターミナルの tpmC

128 同時ターミナルの tpmC

256 同時ターミナルの tpmC

512 同時ターミナルの tpmC

1024 同時ターミナルの tpmC

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