本記事では、Sysbenchツールを使用してOceanBaseデータベースのパフォーマンステストを行う方法について説明します。
Sysbenchとは
SysbenchはLuaJITに基づくマルチスレッドベンチマークツールであり、スクリプトを作成してテストロジックをカスタマイズできます。CPU、メモリ、スレッド、ディスクI/O、データベースなどの主要コンポーネントのパフォーマンスをテストでき、異なるシステムパラメータがデータベースの負荷に与える影響を評価するためによく使用されます。このツールはソースコードを変更する必要がなく、カスタムLuaスクリプトを作成するだけで、多様なビジネスシナリオのテストニーズをシミュレートできます。Sysbenchのテストタイプには、CPUパフォーマンス、ディスクI/Oパフォーマンス、スレッドスケジューリングパフォーマンス、メモリ割り当てとアクセス速度、POSIXスレッドパフォーマンス、およびデータベースパフォーマンスが含まれます。今回は特にデータベースのパフォーマンスに焦点を当ててテストを行います。
説明
ユーザーエクスペリエンスと使いやすさを向上させ、すべての開発者がデータベースを使用する際に良好なパフォーマンスを得られるようにするため、OceanBaseデータベースはV4.0.0以降で多くの最適化が行われました。このパフォーマンステスト方法は、基本的なパラメータに基づいてチューニングを行うだけで、開発者が良好なデータベースパフォーマンス体験を得られるようにします。
環境準備
テスト前に、以下の要件に従ってテスト環境を準備してください。
説明
この例はMySQLテナントを例としています。
ソフトウェア要件
JDK:JDK 1.8u131以降のバージョンを推奨します。
make:
yum install makeコマンドを実行してインストールします。automake:
yum install automakeコマンドを実行してインストールします。autoconf:
yum install autoconfコマンドを実行してインストールします。libtool:
yum install libtoolコマンドを実行してインストールします。GCC:
yum install gccコマンドを実行してインストールします。mariadb-devel:
yum install mariadb-devel mariadbコマンドを実行してインストールします。JDBC:
mysql-connector-java-5.1.47を推奨します。Sysbench:1.0以降のバージョンを推奨します。
OBClient:詳細については、OBClientドキュメントを参照してください。
注意
OBClient V2.2.0以降を使用する場合、デフォルトでob20プロトコルとフルパス追跡機能が有効になり、Sysbenchのパフォーマンスが低下する可能性があります。この機能を無効にするには、環境変数を設定してください。
export ENABLE_PROTOCOL_OB20=0OceanBaseデータベース:ODPを個別にデプロイすることを推奨します。詳細については、OceanBaseデータベースのクイックスタートを参照してください。
IOPS:ディスクIOPSは10000以上を推奨します。
テナント仕様の設定
テナントの仕様は、OceanBaseデータベースSysbenchテストレポートに記載されているハードウェア構成に基づいて設定されます。実際のデータベースのハードウェア構成に応じて動的に調整する必要があります。
クラスタのデプロイ
今回のテストでは5台のマシンを使用します。SysbenchとOBDは1台のマシンに、ODPは別の1台のマシンにデプロイします。OBDを使用してOceanBaseクラスタをデプロイする場合は3台のマシンが必要で、OceanBaseクラスタの規模は1:1:1です。
説明
Sysbenchテストでは、Sysbench、ODP、OBDをデプロイするマシンの構成は、OBServerの総コア数に応じて動的に調整する必要があります。具体的なルールは以下の通りです:
- OBServerの総コア数が47コア以下の場合、そのマシンには8コア64GBで十分です。
- OBServerの総コア数が48コアから72コアの間の場合、そのマシンには16コア128GBが必要です。
- OBServerの総コア数が73コア以上の場合、そのマシンには32コア128GBが必要です。
デプロイが完了したら、まずSysbenchテスト用の新しいテナントとユーザーを作成します(
sysテナントはクラスタを管理するための組み込みシステムテナントであり、sysテナントを直接使用してテストを行うことは避けてください)。テナントのprimary_zoneをRANDOMに設定します。RANDOMとは、新しく作成されたテーブルパーティションのリーダーがこの3台のマシンにランダムに割り当てられることを意味します。説明
クラスタをデプロイする際、
obd cluster autodeployコマンドの使用は推奨されません。このコマンドはシステムの安定性を確保するため、デフォルトでリソース利用の上限(例えばメモリ割り当てに予備容量を確保するなど)を制限します。リソース利用率を最大限に引き出すため、設定ファイルを手動でチューニングすることを推奨します。
テナントの作成
OBD CLUSTER TENANT CREATEコマンドを使用して、テスト用のテナントを作成できます。対応するSQL構文は以下のとおりです:obd cluster tenant create <DEPLOY_NAME> -n <TENANT_NAME> --max-cpu=28 --memory-size=180G -–zone-list=zone1,zone2,zone3 -–primary-zone=RANDOM --locality=F@zone1,F@zone2,F@zone3 --charset=utf8 -s 'ob_tcp_invited_nodes="%"' --optimize=<optimize>パラメータの説明は以下のとおりです:
DEPLOY_NAME:クラスタ名。TENANT_NAME:テナント名。--zone-list:テナントのZoneリスト。--primary-zone:テナントのプライマリZone。--locality:Zone間でのレプリカの分散状況。--charset:テナントの文字セット。-s:テナントのシステム変数値。OPTIMIZE:テナントのワークロードタイプ。express_oltp、complex_oltp、olap、htap、kvの5種類があります。デフォルトのワークロードタイプはhtapで、ハイブリッドOLAPおよびOLTPワークロードに適しています。OBDデプロイの詳細については、obd cluster tenant createを参照してください。注意
V4.3.x以降のバージョンでは、OBDを使用してデプロイする際に、構成パラメータ
scenarioを設定することで適切なクラスタワークロードタイプを選択できます。設定されていない場合、デフォルトのscenarioはhtapです。
例えば、
sysbench_tenantという名前のテナントを作成します。使用するクラスタ名はobperfで、CPUコア数は28コア、メモリ容量は180GBのリソース構成を持ち、デフォルトのテナントワークロードタイプをクラスタのシナリオと一致させます。obd cluster tenant create obperf -n sysbench_tenant --max-cpu=28 --memory-size=180G -–zone-list=zone1,zone2,zone3 -–primary-zone=RANDOM --locality=F@zone1,F@zone2,F@zone3 --charset=utf8 -s 'ob_tcp_invited_nodes="%"' --optimize=htap説明
この例では、
--optimize=htapがデフォルトのワークロードタイプです。本番環境では、実際のクラスタタイプに応じて適切なワークロードタイプを選択してください。
テスト方法
テスト環境が準備できたら、以下の2つの方法でSysbench性能テストを実行できます。
OBDツールを使用してSysbenchテストをワンクリックで実行する
Sysbenchツールを使用してSysbenchテストを手動で実行する
OBDツールを使用したSysbenchテストのワンクリック実行
OBDツールを使用してSysbenchテストを実行する前に、以下の点に注意してください:
- OBDを使用してSysbenchを実行するための詳細なパラメータについては、コマンド
obd test sysbenchを参照してください。 - OBDを使用してワンクリックでテストを実行する場合、クラスタのデプロイはOBDによってインストールおよびデプロイされている必要があります。そうでない場合、クラスタの情報を取得できず、クラスタの設定に基づいたパフォーマンスチューニングができません。
- システムテナントのパスワードがターミナルログインによって変更され、デフォルトの空値ではない場合、まずターミナルでパスワードをデフォルト値に変更し、その後
obd cluster edit-configコマンドを使用して、構成ファイル内のシステムテナントにパスワードを設定する必要があります。構成パラメータは# root_password: # root user passwordです。obd cluster edit-configコマンドの実行が終了したら、obd cluster reloadも実行する必要があります。 obd test sysbenchを実行すると、実行手順と出力が詳細に表示されます。データ量が多いほど、時間がかかります。obd test sysbenchは、テストデータの生成、OceanBaseパラメータの最適化、読み込み、テストを含むすべての操作を自動的に完了します。他の追加操作は不要です。途中でエラーが発生した場合は、コマンドobd test sysbenchを参照して再試行できます。例えば、データの生成をスキップして直接読み込みとテストを実行できます。
OBDツールを使用したSysbenchテストのワンクリック実行手順は以下のとおりです:
依存関係のあるツールをインストールします。
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repoSysbenchツールをインストールします。
sudo yum install ob-sysbenchob_sysbench.shスクリプトを作成します。#!/bin/bash export ENABLE_PROTOCOL_OB20=0 echo "run oltp_read_only test" obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=32 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=64 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=128 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=256 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=512 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_only.lua --table-size=1000000 --threads=1024 --rand-type=uniform echo "run oltp_write_only test" obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=32 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=64 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=128 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=256 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=512 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_write_only.lua --table-size=1000000 --threads=1024 --rand-type=uniform echo "run oltp_read_write test" obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=32 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=64 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=128 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=256 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=512 --rand-type=uniform obd test sysbench <DEPLOY_NAME> --tenant=<TENANT_NAME> --script-name=oltp_read_write.lua --table-size=1000000 --threads=1024 --rand-type=uniformここで、
DEPLOY_NAMEはデプロイされるクラスタの名前、TENANT_NAMEはテナント名であり、実際の環境に応じて変更する必要があります。テストスクリプトを実行します。
chmod +x ob_sysbench.sh ./ob_sysbench.sh(オプション) テストが完了し、結果を確認した後、テストデータをクリーンアップできます。
obd test sysbench <deploy_name> --tenant=<tenant_name> --cleanup
Sysbenchツールを使用したSysbenchテストの手動実行
手動テストは、選択したクラスタの負荷タイプとテナントのチューニングシナリオを設定した後に実施されます。これにより、OceanBaseデータベース、特にパラメータ設定の最適化について深く理解することができます。
ステップ1:テストテナントの作成
説明
テストテナントが環境準備段階で既に作成済みの場合は、このステップをスキップしてください。
システムテナント(sys テナント)で以下のコマンドを実行して、テストテナントを作成します。
説明
今回のテストでは、OceanBaseクラスタの環境デプロイモードは1:1:1です。
リソースユニット
mysql_boxを作成します。CREATE RESOURCE UNIT mysql_box MAX_CPU 28, MEMORY_SIZE '200G', MIN_IOPS 200000, MAX_IOPS 12800000, LOG_DISK_SIZE '300G';リソースプール
mysql_poolを作成します。CREATE RESOURCE POOL mysql_pool UNIT = 'mysql_box', UNIT_NUM = 1, ZONE_LIST = ('z1','z2','z3');MySQLモードのテナント
mysql_tenantを作成します。CREATE TENANT mysql_tenant RESOURCE_POOL_LIST = ('mysql_pool'), PRIMARY_ZONE = RANDOM, LOCALITY = 'F@z1,F@z2,F@z3' SET VARIABLES ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%', secure_file_priv = "/";
ステップ2:環境チューニングを行う
テストを開始する前に、まずOceanBaseデータベースのチューニングを行います。システムテナント(sys テナント)で以下のステートメントを実行し、関連パラメータを設定してください。
ALTER SYSTEM SET enable_sql_audit=false;
ALTER SYSTEM SET enable_perf_event=false;
ALTER SYSTEM SET syslog_level='PERF';
ALTER SYSTEM SET enable_record_trace_log=false;
ステップ3:Sysbenchのインストール
以下の手順に従ってSysbenchをインストールします。
Sysbenchをダウンロードします。
詳細については、SysbenchのダウンロードURLを参照してください。
Sysbenchを解凍します。
unzip ./1.0.20.zipSysbenchをコンパイルします。
Sysbenchの解凍ディレクトリに移動し、以下のコマンドを実行してSysbenchをコンパイルします:
[wieck@localhost ~] $ cd sysbench-1.0.20 [wieck@localhost sysbench-1.0.20] $./autogen.sh [wieck@localhost sysbench-1.0.20] $./configure --prefix=/usr/sysbench/ --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/usr/lib64/mysql/ --with-mysql [wieck@localhost sysbench-1.0.20] $make [wieck@localhost sysbench-1.0.20] $make install [wieck@localhost sysbench-1.0.20] $cp -r /usr/sysbench/share/sysbench/* /usr/sysbench/bin/パラメータの説明:
パラメータ名 説明 --prefix Sysbenchのインストールディレクトリを指定します。 --with-mysql-includes MySQLのincludesディレクトリを指定します。 --with-mysql-libs MySQLのlibディレクトリを指定します。 --with-mysql SysbenchはデフォルトでMySQLをサポートしています。 以下のコマンドを実行して、Sysbenchが正常にインストールされたかどうかを確認します:
[wieck@localhost sysbench-1.0.20] $./src/sysbench --help次の情報が返された場合、Sysbenchのインストールは成功です。
Usage: sysbench [options]... [testname] [command] Commands implemented by most tests: prepare run cleanup help
ステップ4:データの生成
今回のテスト構成は以下のとおりです:
- データ規模:各テストテーブルに100万行のデータを含み、合計30個のテストテーブルを作成します。
- ロード設定:150個の並行スレッドを使用して高負荷をシミュレートします。
- 統計方法:10秒ごとにリアルタイムのパフォーマンス統計を出力します。
- ランダムモード:均等分布のランダム数生成戦略を採用します。
- テスト時間:60秒間連続実行します。
以下の手順でSysbenchテストを実行します:
テストデータを初期化します。
/usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=xxx --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --rand-type=uniform --time=60 cleanupテストデータを生成します。
/usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=test --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --rand-type=uniform --time=60 prepareパフォーマンステストを実行します。
/usr/sysbench/bin/sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=$user@$tenant --mysql-password=xxx --table_size=1000000 --tables=30 --threads=150 --report-interval=10 --time=60 --rand-type=uniform --db-ps-mode=disable runパラメータの説明:
パラメータ名 説明 --mysql-host OceanBaseデータベースを実行するマシンのIPアドレス。ODPがある場合は、ODPのIPアドレスを使用することを推奨します。 --mysql-port ポート番号。 --mysql-db 接続先のデータベース。 --mysql-user ユーザー名。 --mysql-password パスワード。 --table_size 各テーブルの初期化データ量。 --tables 初期化するテーブル数。 --threads 起動するスレッド数。 --time 実行時間。 0に設定した場合、時間制限はありません。--report-interval 実行中のログ、単位は秒です。 --events 最大リクエスト数。このオプションを指定すると、--timeオプションは不要になります。 --rand-type データへのアクセス時に使用するランダム関数。値は special、uniform、gaussian、またはparetoとなります。デフォルト値はspecialで、以前の値はuniformでした。--skip_trx=on 読み取り専用テストでトランザクションを有効または無効にします。デフォルトでは有効です。 --percentile=N パーセンタイルrtを出力します。デフォルト値は 95です。oltp_write_only Sysbenchのluaディレクトリには、insertやpoint_selectなど、さまざまなシナリオ向けのテストケースが組み込まれています。
説明
テスト結果については、OceanBase Sysbenchパフォーマンステストレポートを参照してください。
よくあるエラーメッセージ
Sysbenchのインストールに失敗しました。エラーメッセージは以下のとおりです:
automake 1.10.x (aclocal) wasn't found, exitingこれは、オペレーティングシステムにAutomakeがインストールされていないことを示しています。以下のコマンドを実行してAutomakeをインストールします:
yum install automake.noarchSysbenchのインストールに失敗しました。エラーメッセージは以下のとおりです:
libtoolize 1.4+ wasn't found, exitingこれは、オペレーティングシステムにLibtoolがインストールされていないことを示しています。以下のコマンドを実行してLibtoolをインストールします:
yum install libtoolSysbenchのインストールに失敗しました。エラーメッセージは以下のとおりです:
drv_mysql.c:35:19: fatal error: mysql.h: No such file or directoryこれは、オペレーティングシステムにMySQLのlibライブラリがインストールされていないことを示しています。以下のコマンドを実行してインストールします:
yum install mysql-community-devel.x86_64Sysbenchのインストールに失敗しました。エラーメッセージは以下のとおりです:
cannot find MySQL client libraries in /usr/lib/mysql/以下のコマンドを実行してMySQLのlibライブラリを検索します。通常は
/usr/lib64/mysqlにあります。find /usr -name mysqlSysbenchとOceanBaseデータベースの両方の設定が適切であっても、パフォーマンスが依然として低い場合があります。
SysbenchはCPU、メモリ、ネットワークに非常に敏感なテストです。クライアントとターゲットテストデータベースが同一のローカルエリアネットワーク内にない場合、ネットワーク遅延がSysbenchのパフォーマンスに影響を与える可能性があります。
OceanBaseデータベースクラスタがODPを使用していることに関連しています。まず、単一のOceanBaseデータベースプロセスに対して高同時実行ストレステストを実行し、その結果とODPを使用したシナリオを比較することができます。
ODPとSysbenchを別々のマシンに独立してデプロイし、ODPを使用してSysbenchテストを実行することを推奨します。
高同時実行ストレス下で、なぜシステムのCPU利用率は依然として低いのでしょうか?
全体的にCPU利用率は低いものの、一部のモジュールでは非常に高い利用率に達することがあります。