インスタンスタイプを変更せずに ApsaraDB RDS for PostgreSQL インスタンスのストレージ使用量を削減し、読み取りパフォーマンスを向上させたい場合は、透過的なページ圧縮(TPC)機能を使用できます。この機能は、バッファープール内のページデータをリアルタイムで圧縮および展開します。これにより、ストレージコストが効果的に削減され、I/O スループットが向上します。ただし、この機能は CPU パフォーマンスを低下させます。
前提条件
RDS インスタンスが以下の要件を満たしていること:
RDS インスタンスで PostgreSQL 14 以降が実行されている。
RDS インスタンスで 20240530 以降のマイナーエンジンバージョンが実行されている。マイナーエンジンバージョンの更新方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
機能の説明
TPC 機能は、バッファープール内のページデータをリアルタイムで圧縮および展開します。データはディスクに書き込まれるときに自動的に圧縮され、ディスクから読み取られるときに展開されます。圧縮および展開プロセスは、ユーザーには認識されません。
TPC 機能は、RDS インスタンスのストレージ使用量を削減し、読み取りパフォーマンスを向上させるために開発されました。この機能は、データを圧縮することにより、ディスク I/O とストレージ使用量を削減し、キャッシュ効率を向上させ、データ転送を高速化します。
シナリオ
CPU 使用率が 50% 未満です。IOPS または I/O スループットが頻繁にボトルネックに達します。
メリット
ストレージコストが平均で約 50% 削減されます。
I/O 使用率が平均で約 50% 削減されます。
読み取りシナリオでは、1 秒あたりのトランザクション数(TPS)が増加します。I/O スループットが上限に達する一部の読み取りシナリオでは、TPS が最大 100% 増加します。
影響
この機能は、RDS インスタンスの CPU 使用率を増加させます。データ圧縮の CPU 使用率は約 260% 増加します。データ展開の CPU 使用率は約 40% 増加します。
書き込みシナリオでは、TPS が減少します。
TPC 機能は、TOAST データではパフォーマンスが低下します。
手順
TPC 機能を使用するには、圧縮用の表領域を作成します。これは、この機能が表領域に依存しているためです。
CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');重要この手順で作成される表領域の名前、パス、および圧縮アルゴリズムは変更しないでください。
圧縮用のテーブルまたはインデックスを作成します。
テーブルとインデックスを作成または変更するときに、TPC 機能を使用するために圧縮用の表領域を指定します。
テーブル圧縮
-- テーブルを作成するときに、TPC 機能を使用するために圧縮用の表領域を指定します。 CREATE TABLE <tablename> ... TABLESPACE rds_compress; -- テーブルを変更するときに、テーブルの表領域を圧縮用の表領域に変更します。 ALTER TABLE <tablename> SET TABLESPACE rds_compress;インデックス圧縮
-- インデックスを作成するときに、TPC 機能を使用するために圧縮用の表領域を指定します。 CREATE INDEX <indexname> ... TABLESPACE rds_compress; -- インデックスを変更するときに、インデックスの表領域を圧縮用の表領域に変更します。 ALTER INDEX <indexname> SET TABLESPACE rds_compress;
デフォルトの表領域を圧縮用の表領域に変更します。このようにして、新しいテーブルとインデックスにはデフォルトで TPC 機能が使用されます。
-- デフォルトの表領域を圧縮用の表領域に設定します。 SET default_tablespace TO 'rds_compress'; -- テーブルまたはインデックスを作成するときに、表領域を指定する必要はありません。デフォルトでは、TPC 機能が使用されます。 CREATE TABLE <tablename> ...; CREATE INDEX <indexname> ...;
関連クエリ
テーブルまたはインデックスが圧縮用の表領域に作成されているかどうかを確認します。
psql [コマンドライン] で、
\d+ <テーブル名>と入力して、テーブルの詳細をクエリします。テーブルとインデックスが圧縮用の表領域に作成されている場合、TPC 機能を使用できます。次の出力は、sysbench テーブルのスキーマを示しています。
Table "public.sbtest1" Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description --------+----------------+-----------+----------+-------------------------------------+----------+-------------+--------------+------------- id | integer | | not null | nextval('sbtest1_id_seq'::regclass) | plain | | | k | integer | | not null | 0 | plain | | | c | character(120) | | not null | ''::bpchar | extended | | | pad | character(60) | | not null | ''::bpchar | extended | | | Indexes: "sbtest1_pkey" PRIMARY KEY, btree (id), tablespace "rds_compress" "k_1" btree (k), tablespace "rds_compress" Tablespace: "rds_compress" Access method: heap
データが圧縮されているかどうかを確認します。
pg_database_size、pg_tablespace_size、pg_relation_size、pg_table_size、pg_index_size、pg_total_relation_sizeなどの関数を使用して、データのサイズをリアルタイムで表示できます。説明sysbench を使用して、圧縮テーブルと非圧縮テーブルに同じ量のテストデータを個別に挿入し、テーブルのディスク使用量を確認できます。圧縮テーブルのディスク使用量は、非圧縮テーブルのディスク使用量の約 50% です。
テーブルの圧縮率を計算します。
SELECT pg_relation_size('<tablename>')::float / (relpages * 8192) from pg_class WHERE relname = '<tablename>';説明上記の文では、
pg_relation_size('<tablename>')関数が呼び出され、pg_classシステムディレクトリからテーブルのディスク使用量がバイト単位でクエリされ、取得された値が浮動小数点数に変換されます。次に、浮動小数点数を(relpages × 8192)の値で除算して、各ページの平均サイズをバイト単位で取得します。relpagesは、テーブル内のページの総数を指定します。8192は PostgreSQL のデフォルトのページサイズで、ほとんどの場合 8 KB です。クエリの結果は、テーブルの平均圧縮率を示します。小さい値は、高い圧縮率を示します。
テーブルまたはインデックスの TPC 機能を無効にする
テーブルまたはインデックスの TPC 機能を今後使用しない場合は、次の文を実行して、テーブルまたはインデックスの TPC 機能を無効にします。
ALTER TABLE <tablename> SET TABLESPACE pg_default;
ALTER INDEX <indexname> SET TABLESPACE pg_default;パフォーマンステスト
このテストでは、sysbench を使用して、RDS インスタンスの TPC 機能を有効にする前後のパフォーマンスを評価します。
次の表は、テスト対象の RDS インスタンスの構成を示しています。
仕様 | ストレージ容量 | バッファープール |
8 コア、32 GB | 最大 I/O 帯域幅 350 MB/s の PL1 企業向け SSD(ESSD) | デフォルト値: 8 GB |
極限状態(CPU または I/O リソースが枯渇している)でのテスト 1
テストは、8 GB、80 GB、および 640 GB のデータセットで実行されます。次のコードは、sysbench の主要なパラメーターの構成を示しています。
--tables=100 --table-size=<400000、4000000、または 32000000> --report-interval=1 --time=100 --threads=64データセットのサイズに基づいて、--table-size パラメーターを構成する必要があります。8 GB のデータセットの場合は 400000、80 GB のデータセットの場合は 4000000、640 GB のデータセットの場合は 32000000 にパラメーターを設定する必要があります。
テスト結果
otlp_read_only
データセットサイズ
TPC を有効にするかどうか
TPS
I/O 帯域幅 (MB/s)
CPU 使用率
8 GB
いいえ
6,878
読み取り帯域幅: 0
100%
はい
6,914
読み取り帯域幅: 0
100%
80 GB
いいえ
5,939
読み取り帯域幅: 280
100%
はい
5,945
読み取り帯域幅: 15
100%
640 GB
いいえ
2,222
読み取り帯域幅: 350
44%
はい
4,508
読み取り帯域幅: 320
100%
otlp_write_only
データセットサイズ
TPC を有効にするかどうか
TPS
I/O 帯域幅 (MB/s)
CPU 使用率
8 GB
いいえ
22,151
読み取り帯域幅: 0
書き込み帯域幅: 100
100%
はい
22,314
読み取り帯域幅: 0
書き込み帯域幅: 50
100%
80 GB
いいえ
7,044
読み取り帯域幅: 80
書き込み帯域幅: 270
30%
はい
5,493
読み取り帯域幅: 10
書き込み帯域幅: 180
100%
640 GB
いいえ
2,375
読み取り帯域幅: 80
書き込み帯域幅: 270
20%
はい
1,245
読み取り帯域幅: 25
書き込み帯域幅: 210
100%
非極限状態(CPU および I/O リソースが枯渇していない)でのテスト 2
このテストでは、sysbench を使用して 640 GB のデータセットをテストします。次のコードは、sysbench の主要なパラメーターの構成を示しています。
--tables=100 --table-size=32000000 --report-interval=1 --time=100 --threads=4テスト結果
テスト方法 | TPC を有効にするかどうか | TPS | I/O 帯域幅 (MB/s) | CPU 使用率 |
otlp_read_only | いいえ | 720 |
| 7.5% |
はい | 795 |
| 10.6% | |
otlp_write_only | いいえ | 1,497 |
| 6.8% |
はい | 1,000 |
| 25% |
結論
TPC 機能を有効にした後、次の点に注意してください。
読み取りパフォーマンスが向上します。大きなデータセットを使用する場合、読み取りパフォーマンスが大幅に向上します。
書き込みパフォーマンスが低下します。大きなデータセットを使用する場合、書き込みパフォーマンスが大幅に低下します。
RDS インスタンスは、より多くの CPU リソースを消費し、I/O 消費を削減します。
TPC 機能は、多数の読み取りリクエストと少数の書き込みリクエストを処理する必要があるシナリオに適しています。RDS インスタンスの TPC 機能を有効にすると、特に CPU リソースが十分で I/O リソースの使用率が高い場合に、パフォーマンスが大幅に向上します。
FAQ
RDS インスタンスの TPC 機能を有効にした後、pg_dump と pg_basebackup は想定どおりに実行されますか?
はい、pg_dump と pg_basebackup は想定どおりに実行されます。pg_basebackup を使用して生成されたバックアップデータを別の RDS インスタンスにリストアする場合は、宛先 RDS インスタンスの TPC 機能を有効にする必要があります。