閱讀710 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MPP分布式數據庫性能評估方法 - 阿裏雲HybridDB for PostgreSQL最佳實踐

背景

通常評估一個數據庫的性能,可以選擇工業標準測試,或者根據業務模型,建模進行測試。

例如PostgreSQL pgbench支持的tpc-b測試,以及自定義模型測試。

benchmarksql支持的tpc-c測試。

gp_tpch支持的tpc-h測試等等。

參考文檔如下

《TPC-H測試 - PostgreSQL 10 vs Deepgreen(Greenplum)》

《PostgreSQL 使用 pgbench 測試 sysbench 相關case》

《PostgreSQL pgbench SQL RT 與 事務RT 淺析》

《數據庫界的華山論劍 tpc.org》

但是這些都是在構建了數據庫之後才可以進行的測試,在構建數據庫係統之前,如何評估性能呢?

哪些硬件指標決定了數據庫性能

這些硬件指標是數據庫性能的主要影響因素

CPU主頻  
  
CPU指令集  
  
CPU核數  
  
內存主頻、總線帶寬  
  
硬盤的離散IOPS能力  
  
硬盤的連續IOPS能力  
  
硬盤的帶寬  
  
網絡的帶寬  

針對Greenplum數據庫,它的主要影響如下:

1、CPU主頻

決定了數據庫的計算速度,哪些涉及計算呢?例如:

where條件過濾,select子句中的操作符計算,聚合計算,排序 等。

2、CPU指令集

指令集決定了數據庫的某些特殊優化的性能,例如:

向量計算。

《PostgreSQL 向量化執行插件(瓦片式實現) 10x提速OLAP》

3、CPU核數

CPU主頻決定了單個核的計算能力,而核數,決定了數據庫的並行計算的能力。

4、內存主頻、總線帶寬

當在內存中進行讀寫時,內存主頻和總線帶寬大小決定了整體的讀寫吞吐能力,非常重要。

例如 DDR 2 667,帶寬即為64bit×667MHz÷8≈5.3GB/s,如果是雙通道內存,還得×2,即雙通道DDR 2 667內存數據帶寬為10.6GB/s。

https://www.cyberciti.biz/faq/check-ram-speed-linux/

https://en.wikipedia.org/wiki/Memory_bandwidth

例如這個內存,理論讀寫帶寬 64*2*2400/8/1024= 37.5 GB/s

dmidecode --type 17  
  
        Array Handle: 0x0034  
        Error Information Handle: Not Provided  
        Total Width: 72 bits  ## 帶ECC, 64+8  
        Data Width: 72 bits  
        Size: 32 GB  
        Form Factor: DIMM  
        Set: None  
        Locator: CPU0_A0  
        Bank Locator: NODE 1  
        Type: DDR4  
        Type Detail:   
        Speed: 2400 MHz  
        Manufacturer:   
        Serial Number:   
        Asset Tag:   
        Part Number:   
        Rank: 2  
        Configured Clock Speed: 2133 MHz  

注意,這是內存的理論極限,單個CPU核心處理時,通常不能達到這個極限速度。

單個CPU的處理速度如何?可以通過一個簡單的測試得到

內存速度  
  
#dd if=/dev/zero of=/dev/null bs=4k count=1024000000  
^C68517474+0 records in  
68517473+0 records out  
280647569408 bytes (281 GB) copied, 34.1855 s, 8.2 GB/s  
  
塊設備速度  
#dd if=/dev/塊設備名 of=/dev/null bs=4k count=102300000  
^C2687957+0 records in  
2687956+0 records out  
11009867776 bytes (11 GB) copied, 4.6525 s, 2.4 GB/s  

實際上,在數據庫應用中,算上CPU參與計算的部分,實際上單核應該達不到8.2GB/s的速度。

6、硬盤的離散IOPS能力

索引訪問、多個個會話或進程(並發)訪問同一個硬盤的數據時,會涉及硬盤的離散訪問能力。

(通過預讀,可以提升並發順序訪問的能力,趨於連續IOPS的能力。)

7、硬盤的順序IOPS能力

不考慮並發時,隻要不是索引掃描,通常AP係統大部分是順序的讀寫文件。

8、硬盤的帶寬、硬盤的接口速率

硬盤的帶寬、接口速率決定了數據在硬盤中掃描的上限速度。

例如廠商會給出讀寫帶寬這樣的數據

https://www.shannon-sys.com/product_detail?id=4929256206666909936

注意,這是硬盤的理論極限,單個CPU核心處理時,通常不能達到這個極限速度。

9、網絡的帶寬

網絡帶寬決定了數據導入速度,同時在數據JOIN時,決定了重分布的時候的速度。

單個主機可以有多個網卡,可以有多個數據節點,不管怎樣,按總的出口帶寬來估算,例如GP集群有10台主機,每台主機2張10GB網卡,則總網絡帶寬為200 GB。

10、數據存儲傾斜性

分布式係統的短板效應,最慢的節點決定了總的處理時間。數據出現傾斜時,這個問題尤為突出。

以上是影響性能的主要因素,那麼如何根據這些主要因素,評估SQL的響應速度呢?

PostgreSQL的代價模型中,有一些成本因子,通過成本計算公式和統計信息,可以算出最終的SQL運行成本,如果將成本和時間對齊,就能得知SQL的執行時間。

《優化器成本因子校對 - PostgreSQL explain cost constants alignment to timestamp》

《優化器成本因子校對(disk,ssd,memory IO開銷精算) - PostgreSQL real seq_page_cost & random_page_cost in disks,ssd,memory》

但是這依舊是在有數據庫、有數據(或者有數據的統計信息)導入到數據庫之後進行的評估。

在沒有數據庫,隻有硬件指標和數據指標時,如何評估SQL響應時間呢?

我們可以將公式抽樣出來,根據數據庫集群的指標以及數據的指標,SQL的需求進行評估。

Greenplum性能評估例子

簡化評估模型,因為CPU這方麵(例如LLVM、向量優化、或者其他優化)帶來的效果是非常明顯的,對結果的影響很大。CPU引入的誤差我暫時不計較他。同時我們也不考慮數據傾斜。

1 環境介紹

以如下環境為例,講一下如何評估性能。

1、硬盤

2塊,每塊盤讀寫帶寬分別為2GB/s,通過LVM做成一塊盤。帶寬算4GB/s。

2、內存

512GB,讀寫帶寬 37.5 GB/s

3、CPU

2.5GHz, 32Core

4、網卡

2塊10GB網卡

5、機器台數

8台

6、每台機器上的數據節點數

每台16個數據節點。

2 性能指標數據

某個環境下測試得出的性能指標

以整型數據類型為例:

GP列存

postgres=# create table mmtest(id int) with (appendonly=true, blocksize=2097152, ORIENTATION=COLUMN);  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  
  
postgres=# insert into mmtest select generate_series(1,100000);  
INSERT 0 100000  
insert into mmtest select * from mmtest ;  
...  
postgres=# insert into mmtest select * from mmtest ;  
INSERT 0 409600000  
  
postgres=# select pg_size_pretty(pg_total_relation_size('mmtest'));  
 pg_size_pretty   
----------------  
 3133 MB  
(1 row)  
  
postgres=# select count(*) from mmtest ;  
   count     
-----------  
 819200000  
(1 row)  
  
Time: 779.444 ms  
  
postgres=# select * from mmtest where id=0;  
 id   
----  
(0 rows)  
  
Time: 422.538 ms  

GP 行存

postgres=# create table mmtest1(id int)  
postgres-# ;  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  
Time: 273.659 ms  
postgres=# insert into mmtest1 select * from mmtest;  
  
postgres=# select pg_size_pretty(pg_total_relation_size('mmtest1'));  
 pg_size_pretty   
----------------  
 28 GB  
(1 row)  
  
postgres=# select count(*) from mmtest1 ;  
   count     
-----------  
 819200000  
(1 row)  
  
Time: 1171.229 ms  
  
postgres=# select * from mmtest1 where id=0;  
 id   
----  
(0 rows)  
Time: 452.582 ms  

PG 行存

create unlogged table mmtest(id int);  
postgres=# insert into mmtest select generate_series(1,100000);  
INSERT 0 100000  
insert into mmtest select * from mmtest ;  
...  
postgres=# insert into mmtest select * from mmtest ;  
INSERT 0 409600000  
  
postgres=# select pg_size_pretty(pg_total_relation_size('mmtest'));  
 pg_size_pretty   
----------------  
 28 GB  
(1 row)  
  
postgres=# select * from mmtest where id=0;  
 id   
----  
(0 rows)  
  
Time: 56410.222 ms (00:56.410)  
  
32 並行  
3.02秒  

1、GP 列存儲

單核 4000萬行/s 整型filter速度

整機性能 18.8億行/s 整型filter速度

(含掃描時間)

2、GP 行存儲

單核 3700萬行/s 整型filter速度

整機性能 17.7億行/s 整型filter速度

(含掃描時間)

3、PG 行存儲

單核 1500萬行/s 整型filter速度

整機性能 2.649億行/s 整型filter速度

(含掃描時間)

3 查詢性能評估

1、數據掃描時間

1.1 非內存命中:

每個進程的掃描速度取決於(1. 行的大小,2. 單核的行處理速度:4000萬行/s,3. 單進程的讀速度 2.4GB/s),取最長時間。

每台主機的掃描速度上限是:4GB/s

least(記錄數/(總數據節點數*4000萬), 記錄數/(總CPU核心數*4000萬), 表大小/(數據節點主機數*4G), 表大小/(總數據節點數*2.4G))

1.2 內存命中:

每個進程的掃描速度取決於(1. 行的大小,2. 單核的行處理速度:4000萬行/s,3. 單進程的讀速度 8.2GB/s),取最長時間。

每台主機的掃描速度上限是:37.5GB/s

根據每台主機的節點數可以推算出單機的掃描能力,以及整個集群的掃描能力。

least(記錄數/(總數據節點數*4000萬), 記錄數/(總CPU核心數*4000萬), 表大小/(數據節點主機數*37.5G), 表大小/(總數據節點數*8.2G))

1.3 OSS掃描能力

阿裏雲還提供了一個OSS外部表的功能。

在數據節點上的單個進程目前的訪問速度約30MB/s。如果用戶開多個會話同時訪問,速度線性提升。所以這塊的上限速度是網卡帶寬決定的。

least(主機數*網卡帶寬, 數據節點數*30MB/s)

2、數據運算時間

以整型為例,單核的行處理速度:4000萬行/s

根據數據節點數以及CPU單個核的處理能力評估整個HybridDB for PostgreSQL的處理能力。

least(總記錄數/(總數據節點數*4000萬), 總記錄數/(總數據節點主機CPU數*4000萬))

3、數據聚合時間

以整型COUNT聚合為例,單核的行處理速度:3300萬行/s。

根據數據節點數以及CPU單個核的處理能力評估整個HybridDB for PostgreSQL的處理能力。

least(總記錄數/(總數據節點數*3300萬), 總記錄數/(總數據節點主機CPU數*3300萬))

4、數據排序時間

根據數據節點數以及CPU單個核的處理能力評估。

還和work_mem,臨時文件寫入速度,排序方法有關。

5、數據JOIN時間

根據數據節點數以及CPU單個核的處理能力評估。

和JOIN方法有關,HASH,MERGE,NESTLOOP速度評估方法不一。

hash每個表算一次,同時算一次HASH的時間。

merge每個表算一次SORT的時間。

NESTLOOP,內表需要算N次循環的時間。

JOIN還可能涉及數據重分布,需要估算重分布時間。

6、數據返回時間

按MASTER節點的網絡帶寬,單個CPU的返回速度評估。

4 數據導入性能評估

1、insert 單步提交

並發寫,1萬條/s以內

2、insert 單句批量提交

並發寫,10萬條/s以內

3、insert 事務批量提交

並發寫,10萬條/s以內

4、COPY

並發寫,15萬條/s以內

5、OSS

阿裏雲還提供了一個OSS外部表的功能。

在數據節點上的單個進程目前的訪問速度約30MB/s。如果用戶開多個會話同時訪問,速度線性提升。所以這塊的上限速度是網卡帶寬決定的。

least(主機數*網卡帶寬, 數據節點數*30MB/s)

6、gpfdist

與OSS類似。

6 數據重分布性能評估

數據重分布時間評估

根據總的網絡帶寬評估,比如每台服務器帶寬20G, 總共8台服務器, 總共160G帶寬。

16GB的表,重分布需要16/(160/8) = 16/20 = 0.8秒

7 數據vacuum full(redistribute)性能評估

1、vacuum full

涉及數據重分布,需要考慮數據重分布時間。

2、alter table redistribute.

如果重分布鍵不變,不涉及數據重分布,在節點內完成。

特別適合膨脹數據的收縮。

參考

《優化器成本因子校對 - PostgreSQL explain cost constants alignment to timestamp》

《優化器成本因子校對(disk,ssd,memory IO開銷精算) - PostgreSQL real seq_page_cost & random_page_cost in disks,ssd,memory》

最後更新:2017-08-13 22:51:33

  上一篇:go  每天萬億+級 實時分析、數據規整 - 阿裏雲HybridDB for PostgreSQL最佳實踐
  下一篇:go  拋磚引玉:Greenplum運維腳本編寫方式