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 淺析》
但是這些都是在構建了數據庫之後才可以進行的測試,在構建數據庫係統之前,如何評估性能呢?
哪些硬件指標決定了數據庫性能
這些硬件指標是數據庫性能的主要影響因素
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》
但是這依舊是在有數據庫、有數據(或者有數據的統計信息)導入到數據庫之後進行的評估。
在沒有數據庫,隻有硬件指標和數據指標時,如何評估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》
最後更新:2017-08-13 22:51:33
上一篇:
每天萬億+級 實時分析、數據規整 - 阿裏雲HybridDB for PostgreSQL最佳實踐
下一篇:
拋磚引玉:Greenplum運維腳本編寫方式
點晴免費OA係統的2017年升級記錄
自創數據集,用TensorFlow預測股票教程 !(附代碼)
中國將構建 核安全能力建設網絡
產品經理叫你去改一個 Bug,後來……
6月21日雲棲精選夜讀:國內首位!Node.js社區將阿裏雲工程師張秋怡吸納為CTC成員
jQueryDom——Select、Option
盤點綜藝節目中的那些人工智能技術
國務院關於印發 新一代人工智能發展規劃的通知
4月24日雲棲精選夜讀:噓,別聲張!阿裏研究員的書單被我“偷”來了
iphone繪圖的幾個基本概念CGPoint、CGSize、CGRect、CGRectMake、window(窗口)、視圖(view)