このトピックでは、TPCベンチマークC (TPC-C) ツールを使用して、PolarDB-X 1.0データベースのオンライントランザクション処理 (OLTP) 機能を評価する方法について説明します。 このトピックで説明する手順に従って、データベースをテストし、テスト結果を比較して、データベースシステムのパフォーマンスを評価できます。
背景情報
TPC-Cは、データベースのOLTP機能を評価するために広く使用されているベンチマークです。 これは、Transaction Processing Performance Council (TPC) によって開発およびリリースされています。 TPC-Cには、5つの商取引モデルの10のテーブルが含まれます。 モデルは、新しい注文を生成するためのNewOrder、注文の支払いの支払い、最近の注文を照会するためのOrderStatus、注文を配送するためのDelivery、および在庫不足を分析するためのStockLevelです。 TPC-Cは、1分あたりのトランザクションC (tpmC) を使用して、システムの最大適格スループット (MQTh) を測定します。 測定はNewOrderトランザクションに基づいています。 これは、1分あたりに処理される新しい注文の数が測定されることを意味します。
説明 このトピックで説明するTPC-Cパフォーマンステストは、TPC-Cベンチマークテストに基づいて実装されていますが、TPC-Cベンチマークテストのすべての要件を満たしているわけではありません。 したがって、このトピックで説明されているテスト結果は、TPC-Cのベンチマークテストの公開結果と比較することはできません。
テストデザイン
- 量のテストデータ
- 通常のインスタンスのテスト結果は、1,000ウェアハウスに基づいて取得されます。 次のリストは、各メジャーテーブルのデータ量を示しています。
- bmsql_order_lineテーブルには、300万行のデータが含まれます。
- bmsql_stockテーブルには、100万行のデータが含まれます。
- bmsql_customer、bmsql_history、およびbmsql_oorderテーブルには、それぞれ30万行のデータが含まれています。
- 超大規模インスタンスのTPC-Cテストも導入され、PolarDB-X 1.0の水平スケーラビリティを検証します。 超大規模インスタンスの仕様は、通常のインスタンスの仕様の約10倍です。 超大規模インスタンス用に設計されたストレステストでは、10,000のウェアハウスが構築され、TPC-Cテストのストレステストマシンとして機能するには、3つの32コアのECS (Elastic Compute Service) インスタンスが必要です。 この設計は、ストレス試験機がボトルネックになるのを防ぎます。
- 通常のインスタンスのテスト結果は、1,000ウェアハウスに基づいて取得されます。 次のリストは、各メジャーテーブルのデータ量を示しています。
- インスタンス仕様のTPC-Cテスト
- Enterprise Editionインスタンスのテスト環境: 1つのPolarDB-X 1.0 Enterprise Editionインスタンスには、それぞれ16 CPUコアと64 GBのメモリを備えた2つのノードと、8 CPUコアと32 GBのメモリを備えた4つの専用ApsaraDB RDS for MySQL 5.7インスタンスが含まれます。
- Standard Editionインスタンスのテスト環境: それぞれ8 CPUコアと32 GBのメモリを持つ2つのノードと、4 CPUコアと32 GBのメモリを持つ4つの専用ApsaraDB RDS for MySQL 5.7インスタンスを含む1つのPolarDB-X 1.0 Standard Editionインスタンス。
- 超大規模インスタンスのテスト環境: それぞれ16 CPUコアと64 GBのメモリを備えた16個のノードと、32 CPUコアと128 GBのメモリを備えた12個の専用ApsaraDB RDS for MySQL 5.7インスタンスを含む1つのPolarDB-X 1.0 Enterprise Editionインスタンス。
テストの実行手順
- 手順1: ECSインスタンスの作成ECSインスタンスを作成し、ストレステストマシンとして使用します。 テストデータの準備やストレステストの実行など、次の操作がこのECSインスタンスで実行されます。説明 仮想プライベートクラウド (VPC) にデプロイされているECSインスタンスを作成することを推奨します。 クラシックネットワーク内の一部のインスタンスタイプのApsaraDB RDS for MySQLインスタンスの作成に使用されるリソースが不足している可能性があります。 将来使用するためにVPCの名前とIDを記録します。 以降の手順で説明するすべてのインスタンスをこのVPCにデプロイする必要があります。
- 手順2: ストレステスト用のPolarDB-X 1.0インスタンスの作成
- PolarDB-X 1.0インスタンスを作成します。 PolarDB-X 1.0インスタンスの作成方法の詳細については、 PolarDB-X 1.0インスタンスの作成
- インスタンスでテストするデータベースを作成します。 この例では、
tpccという名前のデータベースが作成されます。 データベースの作成方法の詳細については、 データベースの作成
説明 ECSインスタンスとPolarDB-X 1.0インスタンスが同じVPCにあることを確認します。 - ステップ3: ストレステストのデータを準備する
- ストレステストツールを準備する説明
- この例では、TPC-CテストツールとしてオープンソースのBenchmarkSQL V5.0を使用しています。
- デフォルトでは、BenchmarkSQLはMySQLプロトコルをサポートしていません。 MySQLプロトコルをサポートするには、BenchmarkSQLをコンパイルする必要があります。
- コンパイルされたストレステストパッケージtpcc.tar.gzをダウンロードし、ECSインスタンスで次のコマンドを実行してtpccディレクトリに解凍します:
mkdir tpcc tar zxvf tpcc.tar.gz -C tpcc - 次の説明に基づいて、抽出されたファイルを変更します。
src/client/jTPCC.java (MySQLタイプを追加) src/client/jTPCCConnection.java (エイリアスを追加してMySQL構文のサポートを追加します。) src/LoadData/LoadData.java (ローダーがデータをロードしている間、大規模なトランザクションメカニズムを無効にします。) src/LoadData/LoadDataWorker.java (ローダーがデータをロードしている間、大規模なトランザクションメカニズムを無効にします。) run/funcs.sh (スクリプトにMySQLタイプを追加します。) run/runDatabaseBuild.sh (不要なフェーズを削除) run/runBenchmark.sh (デフォルトのJava仮想マシン (JVM) パラメーターを調整します。) run/runLoader.sh (デフォルトのJVMパラメータを調整します。) ru n/sql.com mon/foreignKeys.sql (外部キーを作成するすべてのステートメントをコメントアウトします。 PolarDB-X 1.0は外部キーをサポートしていません。ru n/sql.com mon/indexCreates.sql (主キーを作成するすべてのステートメントをコメントアウトし、インデックスを作成する2つのステートメントのみを保持します。 デフォルトでは、MySQLはテーブルを作成するときにインデックスを直接作成します。ru n/sql.com mon/indexDrops.sql (プライマリキーを削除するすべてのステートメントをコメントアウトします。) ru n/sql.com mon /tableates. 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 パスワード=tpcc // 倉庫の数。 倉庫=1000 // データのインポートに使用される同時loadWorkerの数。 100の同時loadWorkerは、1秒あたり20,000トランザクション (TPS) を生成すると予想されます。 TPSのビジネス要件に基づいて、同時loadWorkerの数を変更できます。 // デフォルトでは、100の同時loadWorkersのJVMメモリサイズは4 GBです。 runLoader.shファイルを変更することで、JVMメモリサイズを変更できます。 同時loadWorkerの数が500に設定されている場合、JVMメモリサイズを16 GBに設定することを推奨します。 loadWorkers=100 // TPC-Cストレステストの同時発生端子の数。 terminals=1000 // ストレステストの期間。 単位は分です。 runMins=10 // ---------- デフォルト設定 ------ // // 指定されたトランザクションを端末ごとに実行するには-runMinsはゼロに等しくなければなりません runTxnsPerTerminal=0 // 1分あたりの総トランザクション数 limitTxnsPerMin=0 // 4.x互換モードで実行するにはtrueに設定します。 を使用するにはfalseに設定します。// 構成されたデータベース全体。 terminalWarehouseFixed=true // 次の5つの値を合計して100 // 45、43、4、4、4のデフォルトの割合はTPC-Cの仕様と一致します newOrderWeight=45 paymentWeight=43 orderStatusWeight=4 deliveryWeight=4 stockLevelWeight=4 // 詳細な結果データを収集するために作成するディレクトリ名。 // これを抑制するためにコメントしてください。 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説明- テストデータをインポートするときは、
warehouseパラメーターとloadWorkersパラメーターが適切に設定されていることを確認してください。 - TPC-Cテストを実行するときは、
terminalsパラメーターとrunMinsパラメーターが適切に設定されていることを確認してください。
- テストデータをインポートするときは、
- ストレステストの実行
- ECSインスタンスで次のコマンドを実行し、テストデータをインポートします:
cd tpcc /Run ノハップ /runDatabaseBuild.sh props.mysql &説明 既定では、100の同時loadWorkerを使用して、合計500万行を超えるデータがインポートされます。 データのインポートには数時間かかります。 nohupを使用して、インポートタスクをバックグラウンドにプッシュすることを推奨します。 これにより、Secure Shell (SSH) の切断によりタスクが中断されるのを防ぐことができます。 - 次のコマンドを実行してTPC-Cテストを実行します:
cd tpcc /Run . /runBenchmark.sh props.mysqlテストが完了すると、次のテスト結果が返されます:08:56:16,844 [スレッド883] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 104230.88 08:56:16,844 [スレッド-883] INFO jTPCC : Term-00, Measured tpmTOTAL = 231664.49 08:56:16,844 [スレッド-883] INFO jTPCC : Term-00, Session Start = 2019-09-19 08:54:16 08:56:16,845 [スレッド-883] INFO jTPCC : Term-00, Session End = 2019-09-19 08:56:16 08:56:16,845 [スレッド883] INFO jTPCC : Term-00、トランザクション数=465440説明tpmCメトリックはテスト結果を示します。 テスト結果の詳細については、「テスト結果」をご参照ください。 - 次のコマンドを実行してテストデータをクリアします:
cd tpcc /Run . /runDatabaseDestroy.sh props.mysql
- ECSインスタンスで次のコマンドを実行し、テストデータをインポートします:
- ストレステストツールを準備する
テスト結果
| 同時実行 | tpmC for Standard Editionインスタンス | tpmC for Enterprise Editionインスタンス | 超大規模インスタンスのtpmC |
| 1端子 × 1,000同時loadWorkers | 65,735.14 | 101,620.8 | / |
| 6端子 × 1,000同時loadWorkers | / | / | 821,547.97 |