高性能ディスクを使用する RDS MySQL インスタンス向けのバッファープール拡張機能 (BPE) は、ディスク I/O 効率とシステムの応答性を向上させます。 この機能は、バッファプールを拡張してキャッシュを高速化し、RDS インスタンス全体の読み取り/書き込みパフォーマンスを向上させます。 本トピックでは、BPE の仕組み、ユースケース、およびパフォーマンスベンチマークについて説明します。
背景情報
ディスクからメモリへのデータの読み取り、およびメモリからディスクへのデータの書き込みは、一般的なデータベース操作です。 メモリでの操作と比較して、ディスク I/O は大幅に低速で、より多くの時間がかかります。 大規模または頻繁なデータリクエストを伴うワークロードでは、ディスク I/O が主要なパフォーマンスボトルネックになることがあります。
この問題に対処するため、ApsaraDB RDS for MySQL は、新しいストレージオプションである高性能ディスクを提供します。 これらのディスクは、すべての ESSD 機能 と互換性があり、3 階層ストレージアーキテクチャを使用してさまざまな種類のデータとキャッシュを管理します。 高性能ディスクは、I/O バーストとバッファープール拡張機能 (BPE) も導入しており、RDS インスタンスの I/O パフォーマンスをさらに向上させます。
概要
概要
バッファプールは、ディスクからデータをキャッシュするメモリ領域です。 データベースがデータブロックを読み書きする必要がある場合、まずバッファプールをチェックします。
データブロックがバッファプールにある場合、データベースはメモリから直接読み書きします。
データブロックがバッファプールにない場合、データベースはディスクから読み書きし、その後バッファプールにコピーします。
このキャッシュメカニズムは、ディスク I/O 操作を効果的に削減し、インスタンスの I/O パフォーマンスを向上させます。 しかし、バッファプールのサイズはシステムのメモリによって制限されます。 メモリが不足している場合、限られたバッファプールサイズが I/O パフォーマンスに悪影響を及ぼす可能性があります。
RDS MySQL は、バッファープール拡張機能 (BPE) を導入して、バッファプールの有効サイズを拡張します。 RDS エンジンカーネルを活用することで、BPE は RDS MySQL の全体的な読み取り/書き込みパフォーマンスを向上させます。 これにより、インスタンスは一定期間内により多くの読み取りおよび書き込みコマンドを実行できるようになり、ディスク I/O 効率とシステムの応答性が向上し、キャッシュが高速化されます。
メリット
BPE 機能は、Alibaba Cloud の基盤となるストレージメディアを活用して 3 層のストレージ構造を構築することで、さまざまなデータストレージのシナリオや要件に対応し、インスタンスの I/O パフォーマンスを向上させます。
読み取り/書き込みパフォーマンスの向上と SQL 実行時間の短縮
バッファープール拡張機能は読み取り操作をキャッシュし、データページのアクセス速度を大幅に向上させ、SQL 実行時間を短縮します。
バッファープール拡張機能は、インスタンスの高性能ディスク上のデータファイルへのアクセス頻度を大幅に削減し、ディスク帯域幅の使用量を低減します。
インスタンスの安定性の向上
バッファープール拡張機能をホストするディスクは、高性能ディスクよりもレイテンシーが低くなっています。 この設計により、高性能ディスクの I/O ジッターがデータベース操作に与える影響が大幅に軽減され、安定性が向上します。
バッファープール拡張機能 (BPE) ソリューション体験センターでは、実際の RDS 環境を構築し、BPE を有効にした場合と無効にした場合のリアルタイムのストレステスト結果を確認できます。 この機能は無料で使用できます。 詳細については、「RDS 高性能ディスク I/O アクセラレーション (BPE) パフォーマンスの監視」をご参照ください。
費用対効果
バッファープール拡張機能 (BPE) は、対応する RDS MySQL インスタンスでは無料で利用でき、アプリケーションに変更を加える必要はありません。
コストやビジネスロジックを変更することなく、インスタンスの I/O パフォーマンスを大幅に向上させることができます。 たとえば、8 vCPU と 16 GB のメモリを備えた汎用インスタンスタイプの High-availability Edition の RDS MySQL インスタンスは、読み取り/書き込みの QPS を大幅に向上させることができます。 詳細については、「パフォーマンスのテスト」をご参照ください。
仕組み
高性能ディスク向けのバッファープール拡張機能 (BPE) は、バッファープール拡張技術を使用して、追加コストなしで ESSD のパフォーマンスを向上させます。 ホットデータとコールドデータを分離することで、この機能は InnoDB バッファプールを拡張します。 ウォームデータページをバッファープール拡張機能にキャッシュすることで、InnoDB は複数のストレージメディアを柔軟に利用し、より高い QPS を達成できます。
アーキテクチャ
次の図は、BPE のデプロイアーキテクチャを示しています。

バッファープール拡張機能は、メモリと高性能ディスクの間のキャッシュ層として高速ディスクを使用します。 これらの高速ディスクは、高性能ディスクと比較して、I/O レイテンシーが低く、優れたパフォーマンスを提供します。
高速ディスクはキャッシュ専用です。
データファイル、binlog ファイル、および redo ファイルは高性能ディスクに保存されます。
InnoDB バッファプールを拡張することで、システムはメインのバッファプールからバッファープール拡張機能にデータページをキャッシュでき、InnoDB は複数のキャッシュメディアを柔軟に使用できます。
実装
バッファープール拡張機能 (BPE) を有効にすると、システムはインスタンスのデータページを高速ディスク上のバッファープール拡張機能にキャッシュします。
バッファープール拡張機能に保存されているすべてのデータページはクリーンページであり、高性能ディスク上のデータファイル内のデータと一致しています。
データページを読み取る際、システムは次の手順に従います。
クライアントがデータページの読み取りリクエストを開始します。
システムは、要求されたデータページがメモリ内のバッファプールにあるかどうかを確認します。
ページが見つかった場合 (キャッシュヒット)、システムはそれをクライアントに返し、処理は終了します。
ページが見つからない場合 (キャッシュミス)、次の手順に進みます。
システムは、高速ディスク上のバッファープール拡張機能にデータページがあるか確認します。
ページが見つかった場合、システムはそれをメモリ内のバッファプールにコピーしてから、クライアントに返します。 処理は終了します。
ページが見つからない場合、次の手順に進みます。
システムは、高性能ディスク上のデータファイルからデータページを読み取ります。 その後、ページをメモリ内のバッファプールにコピーし、クライアントに返します。
読み取り操作は完了です。
適用範囲
エンジン:RDS MySQL
バージョン:MySQL 8.4、またはマイナーエンジンバージョンが 20230914 以降の MySQL 8.0
エディション:High-availability Edition または RDS Cluster Edition
カテゴリ:Standard Edition
インスタンスファミリー:汎用インスタンスタイプ
リージョンとゾーン: (利用可否についてはコンソールをご確認ください。このリストは参考用です。)
リージョン
ゾーン
中国 (成都)
ゾーン B
中国 (北京)
ゾーン I
中国 (上海)
ゾーン M
ゾーン N
中国 (杭州)
ゾーン J
課金
バッファープール拡張機能 (BPE) は、高性能ディスクを使用する汎用の RDS MySQL インスタンスでは無料で利用できます。
注意事項
バッファープール拡張機能のデータが失われても、ビジネスデータはデータディスクに永続化されているため、影響はありません。 インスタンスは正常に動作し続けます。
BPE 機能を有効にすると、少量のメモリ (
buffer_pool_sizeの 4%) が割り当てられます。 そのため、デフォルトのbuffer_pool_sizeは自動的に 4% 削減されます。 後でbuffer_pool_sizeを変更する必要がある場合は、メモリ使用量のメトリクスに基づいて調整してください。BPE 機能を有効または無効にすると、インスタンスは約 15 秒間利用できなくなります。 この操作はオフピーク時間に実行することを推奨します。
BPE 機能を有効にすると、パフォーマンスが大幅に向上します。 この効果は、より大きなインスタンスタイプでより顕著になります。 たとえば、High-availability Edition (Standard) の 8 vCPU、16 GB の汎用 RDS MySQL インスタンスは、最大 103% のパフォーマンス向上を達成できます。
BPE の管理
BPE の有効化
[インスタンス] ページに移動して、インスタンスのリージョンを選択し、インスタンス ID をクリックします。
[基本情報] セクションで、[ストレージタイプ] の右側にある [高性能 ESSD の設定] をクリックします。 表示されたダイアログボックスで、[バッファープール拡張機能 (BPE)] スイッチをオンにします。
BPE の無効化
[インスタンス] ページに移動して、インスタンスのリージョンを選択し、インスタンス ID をクリックします。
[基本情報] セクションで、[ストレージタイプ] の右側にある [高性能 ESSD の設定] をクリックします。 表示されたダイアログボックスで、[バッファープール拡張機能 (BPE)] スイッチをオフにします。
パフォーマンスのテスト
事前準備
テスト方法:同じ仕様のインスタンスで読み取りおよび書き込み操作を実行し、BPE 機能を有効にした場合と無効にした場合の QPS を比較します。
テストデータサイズ:300 GB
テストツール:Sysbench (詳細については、「Sysbench の公式ドキュメント」をご参照ください。)
説明まず ECS インスタンスを作成する必要があります。 本トピックのテストツールは ECS インスタンスにインストールされています。
テストインスタンス:汎用インスタンスタイプの High-availability Edition の RDS MySQL インスタンスを 2 つ準備します。 1 つは 4 vCPU と 8 GB のメモリ、もう 1 つは 8 vCPU と 16 GB のメモリを搭載しています。 テストは、まず各インスタンスで BPE を無効にして実行し、次に BPE を有効にして再度実行します。
エディション
インスタンスタイプコード
vCPU とメモリ
High-availability Edition
mysql.n2.large.xc
4 vCPU、8 GB
High-availability Edition
mysql.n2.xlarge.xc
8 vCPU、16 GB
テスト方法
本トピックでは、パフォーマンステストの例として CentOS を使用します。 別のオペレーティングシステムでインストールおよびテストする場合は、Sysbench の公式ドキュメントをご参照ください。
Sysbench のインストール
次のコマンドを実行して Sysbench をインストールします。
git clone https://github.com/akopytov/sysbench.git
cd sysbench
git checkout 0.5
yum -y install make automake libtool pkgconfig libaio-devel
yum -y install mariadb-devel
./autogen.sh
./configure
make -j
make install
インスタンスの QPS パフォーマンステスト
パラメーター
次の表に、このテストで使用されるパラメーターを示します。
パラメーター | 説明 |
--tables | テーブルの数。 |
--table_size | 各テーブルの行数。 |
--rand-type | 乱数分布のタイプ。 |
--rand-spec-pct | 指定された乱数分布において「特別」と見なされる値の割合。 |
--threads | 同時実行スレッドの数。 |
--time | テストの実行時間 (秒)。 |
読み取りパフォーマンスのテスト
データの準備:次のコマンドを実行して、300 GB のデータ (テーブル 30 個、各 4,000 万行) を準備します。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare読み取りテストの実行:次のコマンドを実行して、インスタンスの読み取りパフォーマンスをテストします。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
書き込みパフォーマンスのテスト
データの準備:次のコマンドを実行して、300 GB のデータ (テーブル 30 個、各 4,000 万行) を準備します。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare書き込みテストの実行:次のコマンドを実行して、インスタンスの書き込みパフォーマンスをテストします。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
読み取り/書き込みパフォーマンスのテスト
データの準備:次のコマンドを実行して、300 GB のデータ (テーブル 30 個、各 4,000 万行) を準備します。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare読み取り/書き込みテストの実行:次のコマンドを実行して、インスタンスの読み取り/書き込み混合パフォーマンスをテストします。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
テスト結果
汎用インスタンスタイプ、4 vCPU、8 GB メモリの High-availability Edition (Standard) RDS MySQL インスタンスのテスト結果:
読み取りパフォーマンス:BPE を有効にしても、QPS はほとんど変わりません。
書き込みパフォーマンス:BPE を有効にすると、QPS が 30% 増加します。
読み取り/書き込みパフォーマンス:BPE を有効にすると、QPS が 26% 増加します。

汎用インスタンスタイプ、8 vCPU、16 GB メモリの High-availability Edition (Standard) RDS MySQL インスタンスのテスト結果:
読み取りパフォーマンス:BPE を有効にすると、QPS が 80% 増加します。
書き込みパフォーマンス:BPE を有効にすると、QPS が 33% 増加します。
読み取り/書き込みパフォーマンス:BPE を有効にすると、QPS が 103% 増加します。
