全部產品
Search
文件中心

ApsaraDB RDS:透明頁壓縮TPC

更新時間:Feb 27, 2025

如果您希望在不變更RDS PostgreSQL執行個體規格的前提下,減少儲存空間佔用,提高資料庫讀取效能,則可以參考本文,使用透明頁壓縮功能。該功能犧牲部分CPU效能,對Buffer Pool中的頁資料進行即時壓縮和解壓縮,可以有效降低儲存成本、提高IO輸送量。

前提條件

RDS PostgreSQL執行個體版本需要滿足以下條件:

  • 執行個體大版本:14或以上版本。

  • 核心小版本:大於等於20240530,如需升級核心小版本,請參見升級核心小版本

什麼是透明頁壓縮

透明頁壓縮 TPC(Transparent Page Compression)中,頁壓縮指對Buffer Pool中的頁執行即時的IO壓縮和解壓縮,透明是指使用過程中無感知,資料在寫入磁碟時自動壓縮,資料在從磁碟讀取時自動解壓縮。

透明頁壓縮的主要目標是減少儲存空間的使用,並提高資料庫的讀效能。通過壓縮資料,可以降低磁碟IO,減少儲存,提高緩衝效率,並加快資料轉送速度。

應用情境

CPU使用率在50%以下,IOPS或IO吞吐容易達到瓶頸的情境下,推薦使用透明頁壓縮功能。

透明頁壓縮的優勢

  • 儲存成本平均可節約50%。

  • IO使用平均可節約50%。

  • TPS在讀情境會有所提高,部分IO打滿的讀情境最高可提升100%。

影響

  • 該功能會使CPU利用率上漲,壓縮的CPU利用率上漲約260%,解壓的CPU利用率上漲約40%。

  • 在寫情境TPS會有下降。

  • 對TOAST資料的壓縮效果不佳。

操作步驟

  1. 透明頁壓縮功能依賴資料表空間,需要建立壓縮資料表空間。

    CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');
    重要

    本步驟建立的資料表空間名稱、資料表空間路徑以及壓縮演算法請勿修改。

  2. 建立壓縮表或索引。

    • 在建立或修改表、索引時指定壓縮資料表空間,使用透明頁壓縮功能。

      • 表壓縮

        -- 建立表時,指定壓縮資料表空間,即可使用透明頁壓縮功能
        CREATE TABLE <tablename> ... TABLESPACE rds_compress;
        
        -- 將現有表的資料表空間修改為壓縮資料表空間
        ALTER TABLE <tablename> SET TABLESPACE rds_compress;
      • 索引壓縮

        -- 建立索引時,指定壓縮資料表空間,即可使用透明頁壓縮功能
        CREATE INDEX <indexname> ... TABLESPACE rds_compress;
        
        -- 將現有索引的資料表空間修改為壓縮資料表空間
        ALTER INDEX <indexname> SET TABLESPACE rds_compress;
    • 修改預設資料表空間為壓縮資料表空間,後續建立的表和索引,將預設使用透明頁壓縮功能。

      -- 設定預設資料表空間為壓縮資料表空間
      SET default_tablespace TO 'rds_compress';
      
      -- 建立表、索引時無需指定資料表空間,預設使用透明頁壓縮功能。
      CREATE TABLE <tablename> ...;
      CREATE INDEX <indexname> ...;

相關查詢

  • 查詢表、索引是否建立在壓縮資料表空間下:

    1. 在psql命令列中輸入\d+ <表名>查詢指定表的詳細資料。

      如果表和索引都建立在壓縮資料表空間下,則表示可以使用透明頁壓縮功能。以下為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_sizepg_tablespace_sizepg_relation_sizepg_table_sizepg_index_sizepg_total_relation_size等函數查看資料的即時大小。

    說明

    您可以利用sysbench測試載入器分別向壓縮表和非壓縮表中插入相同資料量的測試資料,觀察壓縮表的磁碟佔用情況,壓縮表的大小約為非壓縮表大小的50%。

  • 計算指定表的壓縮比:

    SELECT pg_relation_size('<tablename>')::float / (relpages * 8192) from pg_class WHERE relname = '<tablename>';
    說明

    上述語句中查詢pg_class系統目錄,使用pg_relation_size('<tablename>') 函數擷取指定表的實際磁碟佔用空間大小(以位元組為單位)並轉換為浮點數,通過除以 (relpages * 8192)計算得出每個頁面的平均大小(以位元組為單位)。其中relpages是表的總頁面數,8192是PostgreSQL預設的頁面大小(通常為8KB),最終,查詢的結果表示指定表的平均壓縮比率。值越小,表示壓縮比越高。

將壓縮的表、索引轉為非壓縮的表、索引

當您不再使用透明頁壓縮功能時,執行如下命令可以將壓縮的表、索引轉為非壓縮的表、索引。

ALTER TABLE <tablename> SET TABLESPACE pg_default;
ALTER INDEX <indexname> SET TABLESPACE pg_default;

效能測試

使用RDS PostgreSQL執行個體,使用sysbench工具進行壓力測試,以評估啟用和禁用TPC所帶來的效能表現。

本文以如下配置的RDS PostgreSQL執行個體為例:

規格

儲存

Buffer Pool

8核 32GB

ESSD PL1雲端硬碟(IO頻寬最大為350 MB/s)

預設為8 GB

測試一:極限效能條件下(CPU或IO滿負載)

分別對三個資料集(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;640GB資料集配置為32000000。

測試結果

  • otlp_read_only

    資料集

    是否啟用TPC

    TPS

    IO(MB/s)

    CPU利用率

    8 GB資料集

    6878

    讀:0

    100%

    6914

    讀:0

    100%

    80 GB資料集

    5939

    讀:280

    100%

    5945

    讀:15

    100%

    640 GB資料集

    2222

    讀:350

    44%

    4508

    讀:320

    100%

  • otlp_write_only

    資料集

    是否啟用TPC

    TPS

    IO(MB/s)

    CPU利用率

    8 GB資料集

    22151

    • 讀:0

    • 寫:100

    100%

    22314

    • 讀:0

    • 寫:50

    100%

    80 GB資料集

    7044

    • 讀:80

    • 寫:270

    30%

    5493

    • 讀:10

    • 寫:180

    100%

    640 GB資料集

    2375

    • 讀:80

    • 寫:270

    20%

    1245

    • 讀:25

    • 寫:210

    100%

測試二:非極限效能條件下(CPU和IO均未達到滿負荷)

僅對640 GB資料集進行測試,sysbench工具的關鍵參數配置如下:

--tables=100 --table-size=32000000 --report-interval=1 --time=100 --threads=4

測試結果

測試方式

是否啟用TPC

TPS

IO(MB/s)

CPU利用率

otlp_read_only

720

  • 讀:112

7.5%

795

  • 讀:56

10.6%

otlp_write_only

1497

  • 讀:60

  • 寫:180

6.8%

1000

  • 讀:30

  • 寫:90

25%

測試結論

啟用透明頁壓縮TPC後:

  • 讀效能提升,資料集越大,讀效能提升越明顯。

  • 寫效能下降,資料集越大,寫效能下降越明顯。

  • 執行個體將會消耗更多的CPU資源,從而降低IO的消耗。

由此可見,透明頁壓縮TPC適用於讀操作較多而寫操作較少的業務情境,尤其在CPU資源充足且IO資源佔用較高的情況下,啟用透明頁壓縮TPC後,效能提升尤為明顯。

常見問題

Q:啟用透明頁壓縮TPC後,資料庫工具(pg_dump,pg_basebackup)還能正常使用嗎?

A:pg_dump和pg_basebackup工具可以正常使用,其中如果要將pg_basebackup產生的備份恢複到另一個資料庫時,目標資料庫也需要開啟透明頁壓縮。