ディスクI/OがApsaraDB RDS for PostgreSQLインスタンスのパフォーマンスのボトルネックになった場合、I/Oアクセラレーション機能を使用してパフォーマンスのボトルネックを解決できます。 このトピックでは、I/Oアクセラレーション機能の利点、シナリオ、および実装について説明します。 この機能により、RDSインスタンスが多数の読み取りおよび書き込み要求を処理する必要がある場合に、RDSインスタンスのI/Oパフォーマンスが大幅に向上します。
背景情報
データ処理中、ApsaraDB RDS for PostgreSQLは、ディスクからメモリにデータを読み取り、メモリ内のデータを処理してから、ディスクにデータを書き戻します。 メモリ内操作と比較して、ディスクI/O操作は遅く、完了するまでに時間がかかります。 データベースシステムが多数の読み取りおよび書き込み要求を処理する必要がある場合、ディスクI/Oがパフォーマンスのボトルネックになる可能性があります。
この場合、ApsaraDB RDS for PostgreSQLは一般的なエンタープライズSSD (ESSD) を起動します。 一般的なESSDは、ESSDのすべての機能と互換性があり、3層ストレージアーキテクチャを使用してさまざまな種類のデータを階層的に管理し、I/OバーストおよびI/Oアクセラレーション機能をサポートしてRDSインスタンスのI/Oパフォーマンスを向上させます。 詳細については、「General ESSD」をご参照ください。
機能の説明
I/Oアクセラレーション機能は、一般的なESSDの3層ストレージアーキテクチャのキャッシュ層と同じ方法で機能します。 この機能は、高速キャッシュメディアを使用することで、データベースシステムの読み取りおよび書き込みパフォーマンスを向上させます。 これにより、SQLクエリが高速化されます。 ApsaraDB RDS for PostgreSQLのI/Oアクセラレーション機能は、一時テーブルとクエリ中に生成された一時ファイルを高速キャッシュメディアに格納します。 このようにして、データベースエンジンは、一時的なデータに対して読み書きI/O操作を迅速に実行することができる。 これにより、複雑なクエリシナリオを100% することで、クエリが大幅に高速化され、RDSインスタンスのクエリパフォーマンスが向上します。
メリット
I/Oアクセラレーション機能は無料で提供されます。 I/Oアクセラレーション機能は、追加のコストやビジネスの変更なしに、適用可能なシナリオでのデータベースシステムの1秒あたりのクエリ (QPS) パフォーマンスを大幅に向上させるのに役立ちます。 詳細については、「シナリオ」をご参照ください。
シナリオ
I/Oアクセラレーション機能は、次のシナリオに適しています。
一時データを生成する複雑な操作を実行する必要がある。 複雑な操作には、ソート、グループ化、集約、および結合が含まれます。
再帰クエリは、共通テーブル式 (CTE) を使用して実行する必要があります。
必要なインデックスが利用できない場合は、複雑なクエリを実行する必要があります。
大きなテーブルまたは複数のテーブルに対する分析クエリを実行する必要があります。
一時テーブルを使用する他のワークロードも含まれます。
前提条件
I/Oアクセラレーション機能は、次の要件を満たすRDSインスタンスでサポートされています。
RDSインスタンスは、サブスクリプションまたは従量課金の課金方法を使用します。
RDSインスタンスはPostgreSQL 11以降を実行します。
RDSインスタンスは、20231030以降のマイナーエンジンバージョンを実行します。
RDSインスタンスはRDS High-availability Editionを実行します。
RDSインスタンスは標準製品タイプを使用します。
RDSインスタンスは一般的なESSDを使用しています。
RDSインスタンスは、汎用インスタンスファミリーに属しています。
RDSインスタンスは、次のいずれかのリージョンおよびゾーンにあります。
リージョン
Zone
中国 (成都)
ゾーンB
中国 (北京)
ゾーンI
中国 (上海)
ゾーンM
ゾーンN
中国 (杭州)
ゾーンJ
説明ApsaraDB RDS購入ページでI/Oアクセラレーション機能を有効にした後、[プライマリノードのゾーンとネットワーク] セクションで機能が利用可能かどうかを確認できます。
I/Oアクセラレーション機能の仕組み
キャッシュディスクは、メモリと一般的なESSDとの間で読み書きのパフォーマンスを仲介する高速キャッシュ媒体です。 キャッシュディスクは、一般的なESSDよりも読み書きのパフォーマンスが高いため、データベースシステムに一時的なデータを格納するのに適しています。
RDSインスタンスが存在するサーバーがユーザーから送信されたSQLステートメントを受信すると、クエリエグゼキュータがクエリを実行します。 このプロセスでは、クエリエグゼキュータは、アクセスされるデータのテーブルスペースに基づいてデータストレージの場所を決定します。
I/Oアクセラレーション機能を有効にする前に、すべてのデータをクラウドディスクにのみ保存できます。
I/Oアクセラレーション機能を有効にすると、次のシナリオが発生します。
アクセスされるデータが、通常のテーブルやビューなどの一時的でないデータである場合、クエリ実行プログラムは、データ処理のためにクラウドディスクからメモリにデータを読み取ります。
アクセスされるデータが一時的なテーブルやファイルなどの一時的なデータである場合、クエリ実行プログラムはキャッシュディスクからデータを読み書きします。
RDSインスタンス上に作成された一時テーブルやステートメントの実行中に生成された一時ファイルなどの一時オブジェクトは、キャッシュディスクに格納されます。 これにより、特定の期間内に一時データの読み取りおよび書き込み動作が加速される。 一時オブジェクトのテーブルスペースは明示的に指定されていません。
ApsaraDB RDS for PostgreSQLでは、テーブルスペースを使用してデータベースオブジェクトの格納場所を設定し、ホットデータとコールドデータを分離します。 したがって、rds_temp_tablespace
テーブルスペースは、キャッシュディスクの代わりに使用されます。 RDSインスタンスのI/Oアクセラレーション機能を有効にすると、テーブルスペースを表示できます。 tablespaceを使用するには、temp_tablespaces
パラメーターを有効な値に設定する必要があります。 詳細については、「I/Oアクセラレーション機能の有効化」をご参照ください。
使用上の注意
キャッシュディスクは、一時キャッシュデータの保存にのみ使用できます。 ApsaraDB RDS for PostgreSQLでは、
rds_temp_tablespace
テーブルスペースに格納されたデータの耐久性は保証されません。 RDSインスタンスで仕様変更などのデータ移行操作を実行すると、rds_temp_tablespaceテーブルスペースに格納されているデータが失われます。 したがって、rds_temp_tablespaceテーブルスペースに非一時的なデータベースオブジェクトを格納しないでください。RDSインスタンスのI/Oアクセラレーション機能を有効にすると、RDSインスタンスのインスタンスタイプに基づいて特定の量の高速キャッシュスペースが提供されます。 キャッシュスペースがいっぱいになると、
デバイスにスペースが残っていません
というエラーメッセージが表示されます。 このエラーは、非一時データに対するSQL文の実行には影響しません。RDSインスタンスのI/Oアクセラレーション機能を有効または無効にすると、約30秒間のサービス中断が発生します。 オフピーク時には、この機能を有効または無効にすることを推奨します。
I/Oアクセラレーション機能の有効化
I/Oアクセラレーションをオンにします。
RDSインスタンスの作成時に、RDSインスタンスのI/Oアクセラレーション機能を有効にできます。 前提条件に記載されているすべての要件を満たす既存のRDSインスタンスのI/Oアクセラレーション機能を有効にすることもできます。
RDSインスタンスの作成時にI/Oアクセラレーション機能を有効にします。
RDSインスタンスを作成するときに、前提条件に記載されている要件に基づいてパラメーターを設定し、RDSインスタンスのI/Oアクセラレーション機能を有効にすることができます。
前提条件に記載されている要件を満たす既存のRDSインスタンスのI/Oアクセラレーション機能を有効にします。
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
[基本情報] セクションで、[ストレージタイプ] の右側にある [一般ESSDの設定] をクリックします。 表示されるダイアログボックスで、I/Oアクセラレーションをオンにします。
パラメーター設定を変更します。
RDSインスタンスのI/Oアクセラレーション機能を有効にすると、
rds_temp_tablespace
という名前のテーブルスペースが自動的に生成されます。 テーブルスペースは、I/Oアクセラレーション機能をサポートするキャッシュディスクを使用します。 テーブルスペースをデフォルトの一時テーブルスペースとして使用する場合は、temp_tablespaces
パラメーターをrds_temp_tablespace
に設定する必要があります。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。説明次のSETステートメントを実行して、セッションレベルでパラメーターを設定できます。
SET temp_tablespace TO 'rds_temp_tablespace';
テーブルスペースでクラウドディスクを使用する場合は、
temp_tablespaces
パラメーターを''
に設定できます。
キャッシュアクセラレーション機能を使用します。
I/Oアクセラレーション機能を有効にして必要なパラメーターを変更すると、一時テーブルを作成するときに
rds_temp_tablespace
テーブルスペースが自動的に使用されます。RDSインスタンスに接続します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスへの接続」をご参照ください。
次のステートメントを実行してテストテーブルを作成します。
-- Create a non-temporary table named test_table. CREATE TABLE test_table (di INT); -- Create a temporary table named test_temp_table. CREATE TEMPORARY TABLE test_temp_table (id INT);
テストテーブルのテーブルスペースを照会します。
SELECT c.relname AS table_name, COALESCE(t.spcname, 'pg_default') AS tablespace_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_tablespace t ON c.reltablespace = t.oid WHERE c.relkind = 'r' AND c.relname IN ('test_table', 'test_temp_table');
サンプル出力:
table_name | tablespace_name -----------------+--------------------- test_table | pg_default test_temp_table | rds_temp_tablespace (2 rows)
関連ドキュメント
ApsaraDB RDS For PostgreSQLでサポートされている他のストレージタイプの詳細については、「ストレージタイプ」をご参照ください。
一般的なESSDストレージタイプの詳細については、「一般的なESSD」をご参照ください。
ワークロードが大幅に変動し、ピーク時間が頻繁に変更される場合は、RDSインスタンスの一般的なESSDに対してI/Oバースト機能を有効にできます。 このように、一般的なESSDのIOPSは、RDSインスタンスの最大IOPSの対象にはなりません。 これにより、ピーク時のバースト可能IOPSのビジネス要件を満たすことができます。 詳細については、「I/Oバースト機能の使用」をご参照ください。
FAQ
SQL文の実行時にERROR: could not write to file "pg_tblspc/xxxx": デバイスにスペースが残っていない
というエラーメッセージが表示された場合はどうすればよいですか?
このエラーは、キャッシュディスクを使用するrds_temp_tablespace
の表領域がいっぱいになっているために発生します。 現在のセッションを終了し、RDSインスタンスに再接続してから、失敗したSQLステートメントを再実行できます。 現在のセッションを終了すると、RDSインスタンスのテーブル内の一時ファイルが消去されます。
エラーが解決しない場合は、temp_tablespaces
パラメーターの値を ''
に変更できます。 これにより、テーブルスペースは期待どおりにクラウドディスクを使用できます。