天天看點

MPP分布式資料庫性能評估方法 - 阿裡雲HybridDB for PostgreSQL最佳實踐

通常評估一個資料庫的性能,可以選擇工業标準測試,或者根據業務模型,模組化進行測試。

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

benchmarksql支援的tpc-c測試。

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

參考文檔如下

<a href="https://github.com/digoal/blog/blob/master/201707/20170714_01.md">《tpc-h測試 - postgresql 10 vs deepgreen(greenplum)》</a>

<a href="https://github.com/digoal/blog/blob/master/201610/20161031_02.md">《postgresql 使用 pgbench 測試 sysbench 相關case》</a>

<a href="https://github.com/digoal/blog/blob/master/201609/20160926_03.md">《postgresql pgbench sql rt 與 事務rt 淺析》</a>

<a href="https://github.com/digoal/blog/blob/master/201701/20170125_01.md">《資料庫界的華山論劍 tpc.org》</a>

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

這些硬體名額是資料庫性能的主要影響因素

針對greenplum資料庫,它的主要影響如下:

1、cpu主頻

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

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

2、cpu指令集

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

向量計算。

<a href="https://github.com/digoal/blog/blob/master/201702/20170225_01.md">《postgresql 向量化執行插件(瓦片式實作) 10x提速olap》</a>

3、cpu核數

cpu主頻決定了單個核的計算能力,而核數,決定了資料庫的并行計算的能力。

4、記憶體主頻、總線帶寬

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

例如 ddr 2 667,帶寬即為64bit×667mhz÷8≈5.3gb/s,如果是雙通道記憶體,還得×2,即雙通道ddr 2 667記憶體資料帶寬為10.6gb/s。

<a href="https://www.cyberciti.biz/faq/check-ram-speed-linux/">https://www.cyberciti.biz/faq/check-ram-speed-linux/</a>

<a href="https://en.wikipedia.org/wiki/memory_bandwidth">https://en.wikipedia.org/wiki/memory_bandwidth</a>

例如這個記憶體,理論讀寫帶寬 <code>64*2*2400/8/1024= 37.5 gb/s</code>

注意,這是記憶體的理論極限,單個cpu核心處理時,通常不能達到這個極限速度。

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

實際上,在資料庫應用中,算上cpu參與計算的部分,實際上單核應該達不到8.2gb/s的速度。

6、硬碟的離散iops能力

索引通路、多個個會話或程序(并發)通路同一個硬碟的資料時,會涉及硬碟的離散通路能力。

(通過預讀,可以提升并發順序通路的能力,趨于連續iops的能力。)

7、硬碟的順序iops能力

不考慮并發時,隻要不是索引掃描,通常ap系統大部分是順序的讀寫檔案。

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

硬碟的帶寬、接口速率決定了資料在硬碟中掃描的上限速度。

例如廠商會給出讀寫帶寬這樣的資料

<a href="http://www.shannon-sys.com/product_detail?id=4929256206666909936">http://www.shannon-sys.com/product_detail?id=4929256206666909936</a>

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

9、網絡的帶寬

網絡帶寬決定了資料導入速度,同時在資料join時,決定了重分布的時候的速度。

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

10、資料存儲傾斜性

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

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

postgresql的代價模型中,有一些成本因子,通過成本計算公式和統計資訊,可以算出最終的sql運作成本,如果将成本和時間對齊,就能得知sql的執行時間。

<a href="https://github.com/digoal/blog/blob/master/201311/20131126_03.md">《優化器成本因子校對 - postgresql explain cost constants alignment to timestamp》</a>

<a href="https://github.com/digoal/blog/blob/master/201404/20140423_01.md">《優化器成本因子校對(disk,ssd,memory io開銷精算) - postgresql real seq_page_cost &amp; random_page_cost in disks,ssd,memory》</a>

但是這依舊是在有資料庫、有資料(或者有資料的統計資訊)導入到資料庫之後進行的評估。

在沒有資料庫,隻有硬體名額和資料名額時,如何評估sql響應時間呢?

我們可以将公式抽樣出來,根據資料庫叢集的名額以及資料的名額,sql的需求進行評估。

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

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

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個資料節點。

某個環境下測試得出的性能名額

以整型資料類型為例:

gp列存

gp 行存

pg 行存

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速度

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。

least(總記錄數/(總資料節點數*3300萬), 總記錄數/(總資料節點主機cpu數*3300萬))

4、資料排序時間

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

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

5、資料join時間

和join方法有關,hash,merge,nestloop速度評估方法不一。

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

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

nestloop,内表需要算n次循環的時間。

join還可能涉及資料重分布,需要估算重分布時間。

6、資料傳回時間

按master節點的網絡帶寬,單個cpu的傳回速度評估。

1、insert 單步送出

并發寫,1萬條/s以内

2、insert 單句批量送出

并發寫,10萬條/s以内

3、insert 事務批量送出

4、copy

并發寫,15萬條/s以内

5、oss

6、gpfdist

與oss類似。

資料重分布時間評估

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

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

1、vacuum full

涉及資料重分布,需要考慮資料重分布時間。

2、alter table redistribute.

如果重分布鍵不變,不涉及資料重分布,在節點内完成。

特别适合膨脹資料的收縮。