このトピックでは、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のメモリ)
手順
ストレステスト用のElastic Compute Service (ECS) インスタンスを作成します。
データの準備とストレステストの実行に使用されるECSインスタンスを作成します。 高仕様のPolarDB-Xインスタンスをテストする際のパフォーマンスのボトルネックを防ぐため、32 vCPUと128 GBのメモリを備えたECSインスタンスを作成することを推奨します。
説明ECSインスタンスは、仮想プライベートクラウド (VPC) にデプロイする必要があります。 後で使用するために、VPCの名前とIDを記録します。 後続の手順で説明するすべてのデータベースインスタンスをVPCにデプロイする必要があります。
ストレステスト用のPolarDB-Xインスタンスを作成します。
PolarDB-Xインスタンスを作成します。 ビジネス要件に基づいて、MySQL 5.7またはMySQL 8.0データベースエンジンを選択します。 PolarDB-Xインスタンスの作成方法については、「PolarDB-Xインスタンスの作成」をご参照ください。
PolarDB-Xインスタンスでテストするデータベースを作成します。 この例では、tpcc_1000という名前のデータベースが作成されます。 詳細については、「データベースの作成」をご参照ください。
CREATE DATABASE tpcc_1000;
説明ECSインスタンスとPolarDB-Xインスタンスが同じVPCにあることを確認します。
インスタンスパラメーターの変更
説明ストレステストで最適なパフォーマンスを実現するには、PolarDB-Xインスタンスの計算ノードの特定のパラメーターを変更します。
ENABLE_COROUTINEパラメーターをtrueに設定し、XPROTO_MAX_DN_CONCURRENTパラメーターとXPROTO_MAX_DN_WAIT_CONNECTIONパラメーターを4000に設定します。 詳細については、「パラメーター設定」をご参照ください。
コマンドラインクライアントを使用して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;
ストレステスト用のデータを準備します。
ストレステストツールを準備します。
説明デフォルトでは、BenchmarkSQLはMySQLプロトコルをサポートしていません。 MySQLプロトコルをサポートするには、BenchmarkSQLをコンパイルする必要があります。 この例では、オープンソースのBenchmarkSQL 5.0をTPC-Cテストツールとして使用しています。
パッケージbenchmarksql.tar.gzをダウンロードし、パッケージをECSインスタンスにアップロードしてから、次のコマンドを実行してパッケージを解凍します。
tar xzvf benchmarksql.tar.gzストレステストを設定します。
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_sdaconn: PolarDB-Xインスタンスへの接続に使用される接続文字列。 {HOST} および {PORT} フィールドの値を指定する必要があります。
user: PolarDB-Xインスタンスへのログインに使用されるユーザー名。
password: PolarDB-Xインスタンスへのログインに使用されるユーザー名のパスワード。
倉庫: 倉庫の数。
loadWorkers: データのインポートに使用される同時loadWorkersの数。
terminals: TPC-Cストレステストの同時端子の数。
runMins: ストレステストの期間。 単位は分です。
ストレステストデータをインポートします。
ECSインスタンスで次のコマンドを実行し、ストレステストデータをインポートします。
cd benchmarksql/run/sql.common cp tableCreates.sql.auto tableCreates.sql cd .. nohup ./runDatabaseBuild.sh props.mysql &説明既定では、100の同時loadWorkerは500万行を超えるデータのインポートに使用されます。 データのインポートには数時間かかります。 SSHの切断によりタスクが中断されないように、nohupを使用してバックグラウンドでインポートタスクを実行することを推奨します。
データの整合性を確認します。
コマンドラインクライアントを使用して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;
ストレステストを実行します。
次のコマンドを実行して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。 詳細については、「リリースノート」をご参照ください。

インスタンス仕様 | 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。 詳細については、「リリースノート」をご参照ください。

インスタンス仕様 | 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 |