通常評估一個資料庫的性能,可以選擇工業标準測試,或者根據業務模型,模組化進行測試。
例如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 & 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.
如果重分布鍵不變,不涉及資料重分布,在節點内完成。
特别适合膨脹資料的收縮。