天天看點

關于PostgreSQL的full_page_writes 前言 如何優化 Oracle怎麼解決這個問題的?

full_page_writes用于防範當機時資料的部分寫入導緻無法恢複的問題,還有一個好處是加速replay速度,可以避免随機讀。但是,full_page_writes對性能的影響也非常大。 和關閉full_page_writes相比,打開full_page_writes可能會使TPS減少30%以上,産生的WAL資料量可能會達到5倍以上。同一個page上的更新越稀疏問題越嚴重。

關閉full_page_writes

如果硬體可以減少部分頁面寫入的風險,或檔案系統支援原子寫,或者在發生故障時打算用備份恢複,可以考慮将其關閉。

什麼檔案系統支援原子寫呢?很多技術文章的都以ZFS舉例。但Linux下常用的ext4也可以通過設定“data=journal”使其支援事務寫入。下面有篇文章,用ext4的“data=journal”取代MySQL的double write buffer,性能提升了55%(但這個資料應該嚴重依賴測試場景的,因為很多其他人的測試結果表明,即使關閉double write buffer性能也隻有10%左右的提升)。

https://www.percona.com/blog/2014/05/23/improve-innodb-performance-write-bound-loads/

啟用WAL壓縮

9.5提供了WAL壓縮功能,通過設定wal_compression=on可以啟用壓縮。根據作者在patch裡提供的資料,tps提升20%和WAL資料減小到原來的1/3(當然效果和測試場景有關)。具體參考下面

http://blog.163.com/digoal@126/blog/static/163877040201381963422198/

修改PG防部分寫的機制

康賢在部落格中提到一個double write的patch用于取代full_page_writes,其實就是把MySQL的double write的邏輯搬過來(MySQL的double write比PG的full_page_writes對性能的影響小,并且不會使日志檔案膨脹)。我沒找這個patch的出處,不知道效果和社群的意見如何。

https://yq.aliyun.com/articles/237

找到下面這篇不錯的文章(其實是講MySQL doublewrite的),答案令人吃驚。Oracle對部分頁面寫根本不設防,出了事從備份恢複。我想Oracle能這麼做也許還因為Oracle客戶的系統大多跑在不錯的硬體上,部分頁面寫發生的機率比較低。照這個思路,其實PG或MySQL的很多系統也完全可以關閉對部分頁面寫防護,出了故障還有HA還有備份。

http://www.cnblogs.com/cchust/p/3961260.html

繼續閱讀