このトピックでは、SysBench を使用して PolarDB for MySQL クラスタのオンライントランザクション処理 (OLTP) パフォーマンスをテストする方法について説明します。
テストツール
SysBench は、データベースベンチマーク (MySQL など) およびシステムパフォーマンス評価 (CPU、メモリ、I/O、スレッドなど) に使用されるオープンソースのクロスプラットフォーム パフォーマンス テストツールです。マルチスレッドテストをサポートし、Lua スクリプトを使用してテストロジックを柔軟に制御できるため、データベースのパフォーマンス評価とストレステストに適しています。
テスト環境
Elastic Compute Service (ECS) インスタンスと PolarDB for MySQL クラスタは、同じリージョン、ゾーン、および仮想プライベートクラウド (VPC) にあります。
説明ECS インスタンスと PolarDB for MySQL クラスタは、同じ VPC 内にある必要があります。 パフォーマンス評価の有効性を確保するために、ECS インスタンスの ping レイテンシは 0.2 ミリ秒未満である必要があります。
本文で使用される PolarDB for MySQL クラスタ:
読み取り専用、書き込み専用、および読み取り/書き込みパフォーマンス テストには、2 ノードクラスタ (1 つのプライマリノードと 1 つの読み取り専用ノード) が使用されます。
使用される エンドポイント には、プライマリエンドポイント、クラスタエンドポイント、およびカスタムエンドポイントが含まれます。 実際テスト中は、クラスタリソースを最大限に活用するために、必要に応じて接続文字列の組み合わせを柔軟に調整します。
テストで使用される ECS インスタンス:
インスタンスタイプは ecs.c5.4xlarge (16 コア、32 GB のメモリ) です。
インスタンスのイメージは 64 ビット CentOS 7.0 です。
インスタンスの数は、PolarDB クラスタによって異なります。 計算ノードに 8 コアある場合は、1 つの ECS インスタンスが使用されます。 計算ノードに 16 コアある場合は、2 つの ECS インスタンスが使用されます。
PolarDB for MySQL クラスタパラメータ構成:
高並列テストシナリオでは、エラーメッセージ
can't create more than max_prepared_stmt_count statements
が返され、テストが失敗する場合があります。 この問題に対処するには、max_prepared_stmt_count
パラメータの値を増やして、より多くのプリペアドステートメントを許可します。 詳細については、「クラスタとノードのパラメータを構成する」をご参照ください。大規模な高並列シナリオでは、
max_prepared_stmt_count
パラメータを最大値に設定しても要件を満たせない場合があります。 スムーズなパフォーマンステストを確保するために、テストコマンドにパラメータ--db-ps-mode=disable
を追加することで、プリペアドステートメント 機能を無効にすることができます。大規模クラスタ (88 コア以上) の場合は、クラスタリソースを最大限に活用するために追加のパラメータ調整が必要です。 特定の調整パラメータは、テストページのインスタンスタイプとビジネスシナリオによって異なります。 最適化を実装する前に徹底的なパフォーマンス評価を実行し、実際結果に基づいてパラメータを微調整することをお勧めします。
使用上の注意
このテストでは、それぞれ 25,000 行を含む 250 個のテーブルを持つデータセットを一貫して使用します。 スレッド数は、低い値から高い値に徐々に増加します。 パフォーマンステストの詳細ページには、ピークパフォーマンスの結果のみが表示されます。
テストシナリオ
OLTP パフォーマンス テストを実行して、さまざまな 専用仕様 のクラスタの読み取り専用、書き込み専用、および読み取り/書き込みパフォーマンスを評価します。 各クラスタは、1 つのプライマリノードと 1 つの読み取り専用ノードで構成されます。
メトリクス
1 秒あたりのトランザクション数 (TPS): データベースで 1 秒あたりに実行されるトランザクション数。 コミットされたトランザクションのみがカウントされます。
1 秒あたりのクエリ数 (QPS): データベースで 1 秒あたりに実行される SQL ステートメントの数。INSERT、SELECT、UPDATE、および DELETE ステートメントが含まれます。
Sysbench をインストールする
このトピックのコマンドは、root ユーザーとして実行する必要があります。
ECS インスタンスで次のコマンドを実行して、SysBench をインストールします。
git clone https://github.com/akopytov/sysbench.git ## Git から SysBench をダウンロードします。 cd sysbench ## SysBench ディレクトリに移動します。 ./autogen.sh ## autogen.sh を実行します。 ./configure make -j ## ソースコードをコンパイルします。 make install
次のコマンドを実行して、カーネルがすべて CPU コアを使用してパケットを処理できるように SysBench クライアントを構成します (デフォルト設定は 2 コアです)。CPU コア間のコンテキスト切り替えを削減します。
sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffff>$x/rps_cpus; done'
説明ffff は 16 コアの使用を示します。 実際の構成に基づいてこの値を変更します。 たとえば、ECS インスタンスに 8 コアある場合は、
ff
と入力します。 16 コアの場合は、ffff
と入力し、その他のコア数に合わせて調整します。sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries" sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt" sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt"
テスト手順
次のテスト手順では、PolarDB for MySQL クラスタ を例として使用します。
PolarDB for MySQL クラスタのエンドポイントとポートを取得します。 詳細については、「エンドポイントを管理する」をご参照ください。
プライマリノードによる読み取りリクエストの許可PolarDB for MySQLはいPolarProxy を構成する クラスタの パラメータを に設定します。 詳細については、「」をご参照ください。
データベースに接続します。
ECS インスタンスで次のコマンドを実行して、クラスタに PolarDB for MySQL
testdb
という名前のデータベースを作成します。mysql -h XXX -P XXX -u XXX -p XXX -e 'create database testdb'
説明このコマンドと後続のコマンドの
XXX
を、PolarDB for MySQL クラスタのクラスタエンドポイント、ポート番号、ユーザー名、およびパスワードに置き換えます。 次の表にパラメータを示します。パラメータ
説明
-h
PolarDB for MySQL クラスタのクラスタエンドポイント。
-P
PolarDB for MySQL クラスタのポート番号。
-u
PolarDB for MySQL クラスタのユーザー名。
-p
ユーザー名のパスワード。
特定のシナリオのテストを実行します。
読み取り専用シナリオ (OLTP 読み取り専用)
説明読み取り専用シナリオでは、パラメータ
--range-selects=0
が使用されます。 この構成では、範囲クエリが無効になり、ポイントセレクトクエリに焦点を当てたoltp_point_selects
シナリオが効果的にテストされます。データを準備します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only prepare
読み取り専用テストを実行します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only run
テキストデータをクリーンアップします。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --range-selects=0 --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_only cleanup
主なパラメータ:
パラメータ
表示内容
説明
tables
テーブル数
テストに関係するテーブルの総数。
table_size
テーブルあたりの行数
各テーブルの行数。
データ量
テーブルの総データ量。MB または GB などのストレージ単位で表されます。
threads
同時スレッド数
現在構成されているスレッドの数。
スレッドステータス
スレッドの実行ステータス。
読み取り/書き込みシナリオ (OLTP 読み取り/書き込み)
説明テストは、読み取り操作と書き込み操作が混在する一般的なビジネスワークロードをシミュレートします。
tables、table_size、threads などのコアパラメータは、テストデータページの各テストケースに個別に表示されます。
データを準備します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write prepare
読み取り/書き込みテストを実行します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write run
テストデータをクリーンアップします。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_read_write cleanup
主なパラメータ:
パラメータ
表示内容
説明
tables
テーブル数
テストに関係するテーブルの総数。
table_size
テーブルあたりの行数
各テーブルの行数。
データ量
テーブルの総データ量。MB または GB などのストレージ単位で表されます。
threads
同時スレッド数
現在構成されているスレッドの数。
スレッドステータス
スレッドの実行ステータス。
書き込み専用テスト (OLTP 書き込み専用)
説明tables、table_size、threads などのコアパラメータは、テストデータページの各テストケースに個別に表示されます。
データを準備します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only prepare
書き込み専用テストを実行します。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only run
データをクリーンアップします。
sysbench --db-driver=mysql --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=testdb --table_size=25000 --tables=250 --events=0 --time=600 --rand-type=uniform --threads=XXX oltp_write_only cleanup
主なパラメータ:
パラメータ
表示内容
説明
tables
テーブル数
テストに関係するテーブルの総数。
table_size
テーブルあたりの行数
各テーブルの行数。
データ量
テーブルの総データ量。MB または GB などのストレージ単位で表されます。
threads
同時スレッド数
現在構成されているスレッドの数。
スレッドステータス
スレッドの実行ステータス。
関連情報
PolarDB for MySQL 8.0.2 のテスト結果については、「PolarDB for MySQL 8.0.2 (クラスタ版) のパフォーマンステスト結果」をご参照ください。
PolarDB for MySQL 8.0.1 のテスト結果については、「PolarDB for MySQL 8.0.1 クラスタ版のパフォーマンステスト結果」をご参照ください。
PolarDB for MySQL 5.7 のテスト結果については、「PolarDB for MySQL 5.7 (クラスタ版) のパフォーマンステスト結果」をご参照ください。
PolarDB for MySQL 5.6 のテスト結果については、「PolarDB for MySQL 5.6 (クラスタ版) のパフォーマンステスト結果」をご参照ください。
PolarDB for MySQL と RDS MySQL のテスト結果の比較については、「PolarDB for MySQLとApsaraDB RDS for MySQLのパフォーマンス比較」をご参照ください。