このトピックでは、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 メモリ)
手順
ストレステスト用の 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 インスタンスを作成する」をご参照ください。
説明ECS インスタンスと PolarDB-X インスタンスが同じ VPC にあることを確認してください。
PolarDB-X インスタンスでテストするデータベースを作成します。この例では、tpcc_1000 という名前のデータベースが作成されます。
CREATE DATABASE tpcc_1000 MODE = 'auto';
インスタンスパラメータを変更します。
説明ストレステストで最適なパフォーマンスを実現するために、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.tar.gz をダウンロードして解凍します。
tar xzvf benchmarksql.tar.gz
説明デフォルトでは、BenchmarkSQL は MySQL プロトコルをサポートしていません。MySQL プロトコルをサポートするように BenchmarkSQL をコンパイルする必要があります。この例では、オープンソースの BenchmarkSQL 5.0 を TPC-C テストツールとして使用します。JDK 8 以降が必要で、MySQL 5.7 および MySQL 8.0 と互換性があります。
ストレステストを構成します。
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: ストレステストの期間。単位:分。
ストレステストデータをインポートします。
ECS インスタンスで次のコマンドを実行して、ストレステストデータをインポートします。
cd benchmarksql/run/sql.common cp tableCreates.sql.auto tableCreates.sql cd .. nohup ./runDatabaseBuild.sh props.mysql &
説明デフォルトでは、100 個の同時 loadWorkers を使用して、5 億行を超えるデータをインポートします。データのインポートには数時間かかります。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 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。詳細については、「リリースノート」をご参照ください。
インスタンスの仕様 | 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。詳細については、「リリースノート」をご参照ください。
インスタンスの仕様 | 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 |