このトピックでは、Sysbench ツールを使用して PolarDB for MySQL クラスターのオンライン トランザクション処理 (OLTP) 負荷パフォーマンスをテストする方法について説明します。このトピックの手順に従って独自のテストを実行し、ご利用のデータベースシステムのパフォーマンスを迅速に把握できます。
テストツール
Sysbench は、オープンソースでクロスプラットフォームのパフォーマンステストツールです。主に MySQL などのデータベースベンチマークや、CPU、メモリ、I/O、スレッドなどのシステムパフォーマンステストに使用されます。Sysbench はマルチスレッドテストをサポートし、Lua スクリプトを使用してテストロジックを柔軟に制御できるため、データベースのパフォーマンス評価やストレステストに適しています。
テスト環境
テスト用の Elastic Compute Service (ECS) インスタンスと PolarDB for MySQL クラスターは、同じリージョン、ゾーン、VPC ネットワーク内に配置する必要があります。
説明ECS インスタンスと PolarDB for MySQL クラスターは同じ VPC 内に配置する必要があります。これにより、ECS インスタンスからの PING レイテンシーが 0.2 ms 未満に抑えられ、有効なパフォーマンス評価が保証されます。
テストに使用する PolarDB for MySQL クラスターは次のとおりです:
読み取り専用、書き込み専用、および読み取り/書き込みのパフォーマンステストでは、2 ノードクラスター (プライマリノード 1 つと読み取り専用ノード 1 つ) を使用します。
使用するエンドポイントには、プライマリエンドポイント、クラスターエンドポイント、カスタムエンドポイントが含まれます。テスト中は、データベースクラスターのリソースを最大限に活用するために、必要に応じて接続文字列の組み合わせを調整します。
テスト用の ECS インスタンスの情報は次のとおりです:
インスタンスタイプ:ecs.c5.4xlarge (16 CPU コア、32 GB メモリ)。
イメージ:CentOS 7.0 64 ビット。
インスタンスの数は PolarDB クラスターによって異なります。8 コアのコンピュートノードの場合は ECS インスタンスを 1 台使用します。16 コアのインスタンスタイプの場合は ECS インスタンスを 2 台使用し、以降も同様です。
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 コア以上) の場合、クラスターリソースを完全に活用するには、追加のパラメーターチューニングが必要です。具体的なチューニングパラメーターは、テストページのインスタンスタイプとビジネスシナリオによって異なります。最適化を実施する前に、徹底的なパフォーマンス評価を行い、実際の結果に基づいてパラメーターを微調整してください。
注意事項
このテストでは、tables=250 と table-size=25000 を使用します。threads の値は段階的に増加させます。各パフォーマンステストの製品ページには、ピーク結果のみが表示されます。
テストシナリオ
このテストでは、さまざまな専用インスタンスタイプにわたって、2 ノードクラスター (プライマリノード 1 つと読み取り専用ノード 1 つ) での読み取り専用、書き込み専用、および読み取り/書き込みシナリオの OLTP パフォーマンスを測定します。
メトリクス
TPS (1 秒あたりのトランザクション数):データベースが 1 秒あたりに実行するトランザクションの数で、成功した COMMIT の数に基づきます。
QPS (1 秒あたりのクエリ数):データベースが 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次のコマンドを実行して Sysbench クライアントを設定します。これにより、カーネルがすべての CPU コアを使用してデータパケットを処理できるようになり (デフォルトは 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 クラスターエンドポイントに対して、プライマリノードによる読み取りリクエストの許可 を [はい] に設定します。詳細については、「データベースプロキシの設定」をご参照ください。
データベースへのログイン
ECS インスタンスで次のコマンドを実行して、PolarDB for MySQL クラスターに
testdbという名前のデータベースを作成します。mysql -h XXX -P XXX -u XXX -p XXX -e 'create database testdb'説明このコマンドおよび後続のコマンドの
XXXを、ご利用の PolarDB for MySQL クラスターのクラスターエンドポイント、ポート番号、ユーザー名、パスワードに置き換えてください。パラメーターは次のように説明されます。パラメーター
説明
-hPolarDB for MySQL クラスターのクラスターエンドポイント。
-PPolarDB for MySQL クラスターのポート番号。
-uPolarDB for MySQL クラスターのユーザー名。
-pユーザー名のパスワード。
特定のシナリオのテストコマンドは次のとおりです:
読み取り専用シナリオのテスト (OLTP Read Only)
説明この読み取り専用シナリオでは、--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 Read Write)
説明これは、典型的な読み取り/書き込み混合のビジネスワークロードをシミュレートします。
tables、table-size、threads などのコアパラメーターは、テストデータページに 1 対 1 で表示されます。
データの準備
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 Write Only)
説明tables、table-size、threads などのコアパラメーターは、テストデータページに 1 対 1 で表示されます。
データの準備
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.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 (クラスター版) のパフォーマンス」をご参照ください。