EDB 公司的 PostgreSQL 企業版資料庫,除了原生於社群版本的記憶體配置參數 shared_buffer 可以設定之外,還提供了資料庫的 CPU、I/O 資源使用調控參數 edb_dynatune。更進一步,EDB 還能夠針對資料庫總資源進行分配調控。
Resource Manager 是 EDB 用來控制系統資源使用的功能:對於分配給 EnterpriseDB Postgres Advanced Server(EPAS)的作業系統資源。使用 Resource Manager 建立不同的資源使用規則(Resource Group),便能夠對
- 當下 session、
- 指定帳戶,或
- 指定資料庫
套用某一個資源使用規則。被加入同一個 Resource Group 的 Session / Role / Database,會共同限制分用這個 Resource Group 分配的系統資源。
Resource Manager 可以設定的資源使用規則分成
(1) CPU 資源使用,
(2) Shared Buffer 寫入速率,
- 首先啟用 Resource Manager
[enterprisedb@localhost ~]$ vi $PGDATA/postgresql.conf
. . . edb_max_resource_groups = 3 # 指定要設定幾組資源使用規則 . . .
[enterprisedb@localhost ~]$ pg_ctl restart
- 建立一個 Resource Group
edb=# CREATE RESOURCE GROUP resource_gp1; CREATE RESOURCE GROUP
- 設定該 Resource Group 的 資源限制:cpu 設置參數是以比例設置,用小數點指定;shared budder 設置參數 dirty_rate_limit 的單位是 KB/sec
edb=# ALTER RESOURCE GROUP resource_gp1 SET cpu_rate_limit TO .3, dirty_rate_limit TO 500; ALTER RESOURCE GROUP
在此設定 resource_gp1
- 檢視現有的 Resource Group 與其資源使用規則
edb=# SELECT * FROM edb_resource_group; rgrpname | rgrpcpuratelimit | rgrpdirtyratelimit --------------+------------------+------------------- resource_gp1 | 0.3 | 500 (1 row)
- 建好資源分配群組後,就能將當下 session 、帳戶或 Database 加入一個 Resource Group 中
- 當下運行的 session 使用該一 Resource Group
SET edb_resource_group TO resource_gp1;
- 將帳戶 test_user 加入一個 Resource Group 中
ALTER USER test_user SET edb_resource_group TO resource_gp1;
- 將資料庫 testdb 加入一個 Resource Group 中
ALTER DATABASE testdb SET edb_resource_group TO resource_gp1;
- 檢視目前各個 Resource Group 資源使用狀況的指令
SELECT * FROM edb_all_resource_groups;
測試
以下測試,在配有 1 core, 2.6 GHz 的 VM 上進行,並使用外部工具監控 CPU 使用量。
- CPU 限制的測試:利用 EDB 進行一樣大小的計算階乘,藉以觀察 CPU 使用狀況
edb=# SELECT 30000!;
另外開一個 psql,查看 Resource Group 使用狀況
edb=# \x Expanded display is on. edb=# SELECT * FROM edb_all_resource_groups; -[ RECORD 1 ]----------------+------------------ group_name | resource_gp1 active_processes | 1 cpu_rate_limit | 0.3 per_process_cpu_rate_limit | 0.298687974561313 dirty_rate_limit | 500 per_process_dirty_rate_limit | 16777216
由此可以即時觀察到 CPU 使用率有被 Resource Group 規則限制住。
再觀察 CPU 使用狀況
圖上顯示了兩組測試的CPU使用率的活動:
第一組是 CPU 利用率 100% 的活動,是在沒有啟用 Resource Group 前進行的 30000 階乘計算,
而第二組 CPU 使用率限制在 30% 的活動,則是在啟用 Resource Group 後進行的 30000 階乘計算
以上可見,Resource Manager 在 CPU 使用量控管的效果。
- 要測試 Resource Manager 對 Shared Buffer 的管理,則是利用運作時間來比較。
為了測試方便,會以修飾語句 WITH (FILLFACTOR = 10)建立表格:該語句會使的 Shared Page 數量增加,以進行此部份 Shared Buffer 限制功能的測試
先建立表格
CREATE TABLE t1 (c1 INTEGER, c2 CHARACTER(500)) WITH (FILLFACTOR = 10);
以輸入一萬筆資料的方式進行測試。先進行不設定 Resource Group 的部份。
edb=# \timing
Timing is on.
edb=# INSERT INTO t1 VALUES (generate_series (1,10000), 'aaa');
INSERT 0 10000
Time: 266.969 ms
接著,在這個 session 啟用剛剛建立的 Resource Group,並再次插入一樣大筆的資料:
edb=# SET edb_resource_group TO resource_gp1;
SET
Time: 0.341 ms
edb=# INSERT INTO t1 VALUES (generate_series (1,10000), 'aaa');
INSERT 0 10000
Time: 158725.910 ms
比較以上橘色反白所列時間,可見到 Resource Group 限制造成資料寫入的速率影響,由此可見 Resource Group 對 Shared Buffer 限制影響的是在資料寫入速率。
以上便是 EDB 的企業版的資源管理功能。該功能最簡單的應用,就是可以用來建立測試區 Database,並限制住該區的資源,避免去影響到資料庫於線上正式的工作。