このトピックでは、SysBenchを使用してApsaraDB RDS for MySQLで使用されるX-Engineのパフォーマンスをテストする方法について説明します。 これにより、X-Engineのパフォーマンスを評価できます。
前提条件
- RDSインスタンスのデフォルトのストレージエンジンはX-engineです。 X-Engineを使用する場合、サポート列のXENGINEパラメーターの値はDEFAULTである必要があります。
MySQL [(なし)]> ストレージエンジンを表示します。+ -------------------- + -------------------------------------------------- + | エンジン | サポート | コメント | トランザクション | XA | Savepoints | + -------------------- + -------------------------------------------------- + | FEDERATED | NO | フェデレーションMySQLストレージエンジン | NULL | NULL | NULL | | BLACKHOLE | YES | /dev/nullストレージエンジン (書き込みが消える) | NO | NO | NO | | XENGINE | デフォルト | Xエンジンストレージエンジン | YES | YES | YES | | MEMORY | YES | ハッシュベース、メモリに格納され、一時テーブルに役立ちます | NO | NO | NO | | InnoDB | YES | トランザクション、行レベルのロック、および外部キーをサポート | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | パフォーマンススキーマ | NO | NO | NO | | シーケンス | はい | シーケンスストレージエンジンヘルパー | NO | NO | NO | | MyISAM | YES | MyISAMストレージエンジン | NO | NO | NO | | MRG_MYISAM | YES | 同じMyISAMテーブルのコレクション | NO | NO | NO | | CSV | はい | CSVストレージエンジン | NO | NO | NO | | アーカイブ | YES | アーカイブストレージエンジン | NO | NO | NO | + -------------------- + -------------------------------------------------- + セットの11行 (0.00秒)
- テストに使用されるテーブルはX-Engineに保存されます。 この例では、テストに使用されるテーブルは、ENGINEパラメーターをXENGINEに設定して作成されます。 ENGINEパラメーターをINNODBまたは別のストレージエンジンに設定した場合、テストに使用されるテーブルはX-engineではなく、指定されたストレージエンジンに格納されます。
MySQL [sbtest]> show create table sbtest1; + --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | テーブル | テーブルの作成 | + --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | sbtest1 | テーブル 'sbtest1' の作成 ( `id` int(11) NOT NULL AUTO_INCREMENT, 'k' int (11) NOT NULL DEFAULT '0', 'c' char(120) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''、 'pad'char (60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ''、 主要なキー ('id') 、 キー 'k_1 ' ('k') エンジン=XENGINE AUTO_INCREMENT=2001デフォルトCHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | + --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1行セット (0.01秒)
DTSを使用したストレージ使用量のテスト
Alibaba Cloud Data Migration Service (DTS) を使用して、実際のデータベースデータをRDSインスタンスに移行し、X-Engineのディスク使用状況を確認することを推奨します。 この場合、テスト結果は実際のビジネス状況に近いものになります。 X-Engineは、ディスク使用量を削減するために、スペースにやさしいストレージ形式、プレフィックスエンコード、階層ストレージ、効率的な圧縮アルゴリズムなどのテクノロジーを採用しています。 これらのテクノロジの実際の効果は、データベースのスキーマとレコードの長さによって異なります。 したがって、実際のデータベースデータを使用すると、より正確なテスト結果を得ることができます。
DTSは、データ移行中のストレージエンジンの自動変換をサポートしていません。 X-Engineを実行するRDSインスタンスでデータベースとテーブルを手動で作成し、「前提条件」セクションで説明されているテーブル作成ステートメントでENGINEパラメーターをXENGINEに設定し、DTSを使用してデータを移行する必要があります。 スキーマを移行しないでください。
データのインポートが完了した直後にSQL文を実行しないことをお勧めします。 ApsaraDB RDSコンソールで、RDSインスタンスのCPU使用率とIOPS使用率を監視できます。 CPU使用率とIOPSがゼロに近づいたら、SQL文を実行してX-Engineのパフォーマンスをテストできます。 この場合、ディスク使用量がより正確に算出される。 これは、X-Engineで使用されるログ構造のマージツリー (LSMツリー) アーキテクチャが、データ圧縮などの機能を実装するためのバックグラウンド非同期タスクに依存しているためです。 これらの機能は、ストレージコストの削減に役立ちます。 バックグラウンド非同期タスクは時間がかかり、CPUおよびIOPSリソースを消費します。
詳細については、「ApsaraDB RDS For MySQLインスタンス間のデータ移行」をご参照ください。
SysBenchを使用してストレージ使用量をテストする
X-Engineの圧縮効率を完全にテストするには、次のコマンドでtable_sizeパラメーターをRDSインスタンスのストレージ容量内の大きな値に設定することを推奨します。
ApsaraDB RDSコンソールでRDSインスタンスのCPU使用率とIOPS使用率を監視することを推奨します。 CPU使用率とIOPSがゼロに近づくと、ストレージ使用率がより正確に計算されます。
次のコマンドを実行して、ストレージの使用状況をテストします。
sysbench /usr/share/sysbench/oltp_update_index.lua \
-- mysql-host=[RDSインスタンスのエンドポイント] \
-- mysql-user=sbtest \
-- mysql-password=sbtest @ 888 \
-- mysql-db=sbtest \
-- threads=32 \
-- tables=32 \
-- table_size=1000000000 \
-- mysql-storage-engine=XENGINE \
準備する
SysBenchを使用したパフォーマンスのテスト
パフォーマンステストにSysBenchを使用する場合は、rand-typeパラメーターをzipfianに設定し、rand-zipfian-expパラメーターを0.9に設定することを推奨します。
- rand-type: SQL文で乱数を生成するために使用される分布の型を指定します。
- Zipfian分布: ホットスポットを持つ一般的なデータ分布。 rand-zipfian-expパラメーターを0.9に設定すると、Zipfian分布を使用して生成される乱数は、実際のシナリオで生成される乱数に近くなります。 テスト結果は、デフォルトの均一分布を使用して生成されたものと比較してより価値があります。
1回のテストを3,600秒などの長時間実行することをお勧めします。 長時間の試験から得られた平均性能の試験結果は、より価値があり、潜在的な干渉要因の影響を受けにくい。
スループットをテストするには、512スレッドなど、多数のスレッドを使用することを推奨します。
パラメーターを設定してX-Engineのパフォーマンスを向上させるには、Alibaba Cloudアカウントマネージャーまたはアフターサービスエンジニアにお問い合わせください。
次のコマンドを実行して、パフォーマンスをテストします。
sysbench /usr/share/sysbench/oltp_point_select.lua \
-- mysql-host=[RDSインスタンスのエンドポイント] \
-- mysql-user=sbtest \
-- mysql-password=sbtest @ 888 \
-- time=3600 \
-- mysql-db=sbtest \
-- tables=32 \
-- threads=512 \
-- table_size=10000000 \
-- rand-type=zipfian \
-- rand-zipfian-exp=0.9 \
-- report-interval=1 \
実行
Pythonスクリプトを使用して一度に複数のテストを実行する
SysBenchを使用して一度に複数のテストを実行する場合は、テストを自動的に実行してテスト結果を記録できるPythonスクリプトを使用することをお勧めします。 スクリプトを実行すると、RDSインスタンスのエンドポイントを入力するように求められます。 例:
importサブプロセス
インポート時間
インポートsys
def execute_test(test_name, db_conn_string):
# セットアップsysbenchパラメータ
mysql = "-- mysql-host=% s" % db_conn_string
user = "-- mysql-user=sbtest"
password = "-- mysql-password=*********"
time = "-- time=3600"
database = "-- mysql-db=sbtest"
tables = "-- tables=32"
threads = "-- threads=512"
table_size = "-- table_size=1000000"
distribution = "-- rand-type=pareto -- rand-pareto-h=0.9"
# sysbenchコマンドの定式化
cmd = 'sysbench '+ test_name + "" + mysql + "" + user + "" + password + "" + time + "" + database + "" + tables + "" + threads + "" + table_size + "" + distribution + "" + "-report-interval=1" + "" "" ""
# execute
out = subprocess.check_output(cmd,
stderr = subprocess.STDOUT, shell=True)
# sysbench出力をファイルに出力する
output_file_name = "xengine_result_" + test_name[20:len(test_name)]
output_file = open(output_file_name, "w")
output_file.write(out)
output_file.close()
if __name__ ='__main__':
# テストするMySQL (X-Engine) インスタンスの接続文字列
db_conn_string = sys.argv[1]
test = [
"/usr/share/sysbench/oltp_update_index.lua" 、
"/usr/share/sysbench/oltp_point_select.lua" 、
"/usr/share/sysbench/oltp_read_only.lua" 、
"/usr/share/sysbench/oltp_write_only.lua" 、
"/usr/share/sysbench/oltp_read_write.lua" 、
"/usr/share/sysbench/oltp_insert.lua"
]
テストのatestのため:
print("start test:\t % s\t % s" % (atest, time.ctime()))
execute_test(atest, db_conn_string)
print("end test:\t % s\t % s" % (atest, time.ctime()))
# 数秒間眠る
# 挿入 /更新 /削除を使用したテスト期間の後、x-engineは完了するまでに時間が必要です
# その非同期バックグラウンド圧縮。
time.sleep(1000)