從PG15 WAL壓縮優化說起,你明白了嗎?
PG 15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG 15 BETA已經發出幾個月了,似乎PG 15里令人激動人心的功能不多,不過從長長的新功能列表里,我還是能夠從中學到不少東西。數據庫的發展是和現代硬件技術的發展密切相關的,而數據庫在某一個方面的突破,可以為應用提供更大的舞臺,讓應用能夠更加適應某些特定場景。
實際上經過幾個重要特性的跳票之后,我對PG 15的期待最主要集中在FULL PAGE WRITE的優化上了。以前我也多次寫文章研究過PG的WAL產生以及CHECKPOINT對高負載應用寫入性能的影響。其實這些性能影響大部分來自于FULL PAGE WRITE。因為當某個臟塊在CHECKPOINT完成后的第一次被寫入的時候,都需要做一次FULL PAGE WRITE,以避免數據庫需要恢復時出現塊斷裂的情況。而FULL PAGE WRITE大規模產生的時候,因為WAL的寫入量大大增加,就會導致高并發寫應用的性能問題。實際上,當我們在做pg_basebackup等在線備份操作時,也是會引發大量的FULL PAGE WRITE的。緩解這個問題的方法是加大CHECKPOINT的延時,讓兩次CHECPOINT的間隔更長一些,這樣就會大量減少FULL PAGE WRITE。
加大CHEKPOINT的延時也是一個雙刃劍,因為這會讓數據庫在恢復時需要RECOVER更多的頁,同時也會在一個CHECKPOINT時集中寫入大量的數據塊。在瞬時對IO產生更大的影響。
在PG中關閉FULL PAGE WRITE也是一個選項,只不過需要找到支持PG關閉FULL PAGE WRITE的文件系統或者存儲系統。我們以前曾經在ZFS上嘗試過關閉FULL PAGE WRITE,效果是相當不錯的。只不過在我們的大多數PG運行環境中并沒有使用ZFS,因此對于PG 15在FULL PAGE WRITE上的優化,我們還是很期待的。
我曾經也考慮過通過WAL壓縮來緩解FULL PAGE WRITE的問題,在PG 12上我們做過一個測試,打開WAL壓縮。只不過打開WAL壓縮后,PG數據塊的高并發寫入性能并未提升,反而略有下降。能夠從以前的PG 12的WAL壓縮中獲得性能提升的場景十分有限。
PG 15的WAL壓縮有了一個十分令人興奮的改進,除了支持PGLZ外,WAL壓縮還支持LZ4和ZSTANDARD兩種壓縮算法。
從官方的對比來看,ZSTD是一種平衡了壓縮解壓吞吐量與壓縮比的十分優秀的壓縮算法,而LZ在壓縮比上雖然不如ZSTD,但是在壓縮吞吐量上有著特別優秀的表現。這兩種壓縮算法的引入,必定會大大改善WAL壓縮的性能。
因為時間關系,我們目前還沒有全面開展PG 15的測試,我想還是等正式版出來后再做完整的測試。不過從目前國外一些朋友對PG 15的測試來看,還是十分令人期待的。我們根據Mark Callaghan的測試用例來看一看效果吧。
和我們的預期相同,使用以前的pglz,對于僅有PK的場景影響并不大,對于PG來說,第一次數據寫入,都是創建的新塊,不同的算法之間的影響還不算太大。但是對于其他場景影響較大。而使用LZ4的效果極佳,裝載性能有了明顯的提升。zstd在有多個索引時的數據裝載表現出了較好的性能。
不過從上面的測試來看,還是比較簡單的,因此這個測試結果頁并不說明太多的問題。不過有一點是可以確定的,那就是LZ4和ZSTD的引入,會大大優化WAL 壓縮的性能,從而緩解FULL PAGE WRITE的問題,也可以大大減輕DBA優化CHECKPOINT的工作。CHECKPOINT的優化可能會在大多數場景下變得更簡單了,我們只要根據自己的場景需求,選擇設置WAL壓縮參數就可以了。
挺巧的是,在PG 15里,增加了一個新的權限:pg_checkpointer。以往checkpint命令只能由超級用戶來執行。而PG 15里,只要是授予這個權限的用戶,都可以在自己的應用里執行checkpoint命令了。將checkpoint命令的權限下放,是PG 15細粒度權限控制優化的一部分。不過既然敢下放權限,那就說明checkpoint帶來的副作用已經可控了。隨著現代硬件的發展,IO問題已經得到了大大地緩解,同時因為WAL壓縮的優化,也為checkpoint權限下放提供了有力的支撐。
不過業務場景十分復雜,這個權限還是不要隨便授予,因為目前來看,我還沒有想清楚,這個權限下放的真實好處在什么地方,什么場景下,應用需要自己去控制checkpoint。如果有一天,DBA發現一個撓頭的IO性能問題,是因為某個應用系統頻繁執行checkpoint引發的,那就麻煩大了。對于開發人員來說,讓每條記錄盡快寫盤肯定是件喜聞樂見的事情,而對于DBA來說,那可能是個災難。