PostgreSQL IO優化技巧
?PostgreSQL近些年熱度越來越高,特別在國內,基于其生態的數據庫產品種類繁多。如果有人問“信創數據庫學啥比較好”,從今后的工作機會以及學習資料的普及程度來說,我首先推薦的就是PostgreSQL。
不過目前大多數PostgreSQL用戶都沒有認真配置數據庫,讓其達到最佳的使用效果,并充分發揮出硬件的性能特征。其中數據庫IO的優化是重中之重,IO延時較大會導致所有的SQL都會變慢。今天的這篇文章將介紹提高 PostgreSQL IO 性能的八個技巧。
首先,使用相應速度更快,吞吐能力更強的存儲硬件:提高 IO 性能的最重要因素之一是用于存儲數據庫文件的存儲硬件。在關鍵系統中,一般會考慮使用固態硬盤 (SSD) 或硬件 RAID 陣列以獲得更快的讀寫速度。高性能低延時的集中式SAN存儲是傳統大型數據庫的主要存儲介質,不過現在很多PG數據庫都在單機部署,使用服務器本地存儲,從而降低使用成本。在本地存儲中充分優化存儲性能,提高存儲介質可靠性是十分關鍵的。用本地SATA SSD盤可以有效提高數據庫的整體性能,在HDD上增加高性能緩沖也是性價比很高的做法。為企業應用設計一個性能優秀,價格適中的本地存儲方案,是確保PG IO性能的關鍵。
第二,調整 shared_buffers:shared_buffers 配置參數確定 PostgreSQL 用于在內存中緩存數據頁的內存量。調整此參數以匹配系統上可用的內存量以獲得最佳性能。由于PG數據庫使用double buffer機制,因此不同的業務負載,shared_buffers參數的設置會有所不同。PG管網建議配置25%的物理內存給shared_buffers使用,這是一種當你不了解業務場景與數據分布時的中庸的配置方案。舉個例子,如果你的物理內存是256GB,而你的常用數據是100GB,那么設置一個128GB的shared_buffers有可能是比較好的配置。設置shared_buffers的首要原則是,不能讓操作系統產生較多的換頁,如果OS經常性出現換頁,那么你要評估一下是不是由于shared_buffers占用了過多的物理內存,導致OS內存使用率過高引起的。
第三,優化WAL的配置:WAL是 PostgreSQL 中的一項關鍵功能,可確保事務的持久性和一致性。配置 wal_buffers 參數以匹配您的工作負載并確保最佳 WAL 性能。調整 wal_buffers 的值時,重要的是要考慮生成 WAL 數據的速率,增加 wal_buffers 的值有助于降低磁盤寫入頻率并提高性能,不過在普通的負載下,調整wal_buffers并不能看到數據庫性能的提升,只有當WAL寫入BUFFER的速度大于Walwriter寫盤的速度的時候,加大wal_buffers才會有特別明顯的性能提升。作為一般規則,建議將 wal_buffers 的值設置為磁盤塊大小的小倍數,16 MB。除了調整wal_buffers之外,調整max_wal_size等參數也能有效地減少WAL導致的性能下降,另外CHECKPOINT的優化也能大幅減少WAL的寫出量,從而優化WAL的性能。
第四,IO分區:IO分區是一種將數據和索引分布在多個磁盤上的技術,它可以通過減少磁盤 I/O 爭用來幫助提高 IO 性能。考慮使用表和索引分區來利用這種性能提升。將WAL存儲與單獨的高性能存儲也是IO分區的一種十分常用的做法,對于高并發環境的數據庫IO性能提升十分有效。利用tablespace將熱表分散到不同的存儲上去也是十分有效的IO分區的方法。不過大家要注意的是,要使用IO分區,首先要確保存放PG數據庫的磁盤或者磁盤組本身是分區的,具有一定的隔離性,如果你在一個磁盤組上分出多個邏輯卷,然后將PG的存儲做IO分區,那么用處就不大了。
第五,預熱緩存:pg_prewarm 擴展可用于預熱具有頻繁訪問數據的緩存,減少未來查詢所需的磁盤 I/O 量。以前大家都做過很多測試,發現在PG數據庫中某條SQL執行計劃不變的情況下,執行速度差異很大,最終大家都發現了如果SQL訪問的大多數數據都在shared buffers中或者在OS的FILE CACHE中,那么執行效率是較高的。因此在PG數據庫中對熱數據做預熱緩沖是有效提升數據庫性能的方法。Pg_prewarm是一個十分常用的緩沖預熱插件。
安裝完插件后,我們可以使用select pg_prewarm(‘tablename’)來預熱某張表的數據。在某些大型統計報表開始之前先預熱數據是提高性能的很好的方法,用于預熱數據的PG插件也很多,大家可以根據需要選擇使用。
第六,優化檢查點:檢查點是將共享緩沖區緩存中的臟頁刷新到磁盤的過程。降低檢查點的頻率和大小有助于減少磁盤 I/O 并提高性能。優化檢查點性能的一些技術包括增加 checkpoint_timeout 和 checkpoint_completion_target 配置參數,以及使用更快的存儲硬件來存儲數據和 WAL 文件。
第七,調整CBO策略參數:調整 effective_cache_size,random_page_cost等多個參數都是CBO優化器來評估各種操作的成本的重要參數,在一個有數萬甚至數十萬條SQL語句的數據庫系統而言,CBO能夠產生合理的執行計劃對于數據庫性能至關重要,PG數據庫沒有Oracle那么強大的SQL優化工具與優化手段來輔助,因此設置好這些與CBO產生合理執行計劃緊密相關的參數十分重要。effective_cache_size 配置參數用于估計 PostgreSQL 可用的磁盤緩存量,從而確定掃描數據的成本。random_page_cost 配置參數確定隨機磁盤 I/O 相對于順序磁盤 I/O 的成本。設置此參數以準確反映系統上隨機磁盤 I/O 的成本。據磁盤類型的不同,對 random_page_cost 的設置也會有所不同:對于 HDD,可以設置為 4.0 到 4.5;對于 SSD,可以設置為 1.0 到 1.5。如果使用中央化的 SAN 存儲,可以根據其具體配置和性能進行調整,為了設置合理的值,需要對你的存儲的隨機讀寫性能進行測試。PG中還有幾個類似的參數,可能會影響到CBO生成執行計劃,如果你發現你的PG數據庫中存在較多的錯誤的執行計劃,那么可以嘗試調整一下這些參數:seq_page_cost、cpu_tuple_costcpu_index_tuple_cost、cpu_operator_cost。
第八,操作系統參數優化:主要是在VM的后臺寫、前臺寫、臟塊刷新策略、內存換頁策略等方面進行優化,這方面我以前已經寫過多篇文章介紹,在這里就不重復了,有興趣的朋友可以去翻閱一下我以前的發文。
綜上所述,這八個技巧可以大大提高 PostgreSQL 的 IO 性能。請務必仔細考慮您的硬件設置并配置適當的參數以獲得最佳結果。?