Freeze 风暴导致的IOPS飙升 - 追溯与解法
標簽
PostgreSQL , iops 飆升 , freeze 風暴
背景
在使用PG 9.6以前的版本時,freeze帶來的IOPS影響較大,體現在數據文件讀寫、WAL日志大量產生。
原因是9.6以前的版本,當表的年齡達到一定的閾值后(全局參數或表級參數控制),會觸發freeze的動作,掃描全表,同時有可能(如果BLOCK被FREEZE的話)產生WAL(越大的表,帶來的IO越大)。
freeze相關參數如下:
#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum # (change requires restart) #autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age # before forced vacuum # (change requires restart) #vacuum_freeze_min_age = 50000000 #vacuum_freeze_table_age = 150000000 #vacuum_multixact_freeze_min_age = 5000000 #vacuum_multixact_freeze_table_age = 150000000 log_autovacuum_min_duration=0那么當數據庫突發IO時,如何知道是什么產生的?
1、查看日志
配置了log_autovacuum_min_duration=0時,所有的auto vacuum在日志中都會被記錄下來。可以觀察日志。
$PGDATA/log 或 $PGDATA/pg_log2、查看統計表,統計表記錄了最后一次被VACUUM的時間。
select age(a.relfrozenxid), last_autovacuum,last_vacuum,schemaname,a.relname,pg_size_pretty(pg_total_relation_size(relid)) from pg_class a, pg_stat_all_tables b where a.oid=b.relid and a.relkind in ('r', 'm') order by last_autovacuum nulls last;可以大概推測。
age | last_autovacuum | last_vacuum | schemaname | relname | pg_size_pretty ----------+-----------------+-------------+--------------------+-------------------------+---------------- 46 | | | public | test | 5608 MB 43 | | | public | test1 | 5784 kB 80593695 | | | pg_catalog | pg_statistic | 248 kB 80593695 | | | pg_catalog | pg_type | 184 kB 39 | | | public | a | 48 kB 32 | | | public | b | 16 kB 80593695 | | | pg_catalog | pg_policy | 16 kB 22 | | | public | c | 48 kB 80593695 | | | pg_catalog | pg_authid | 72 kB ..............3、分析WAL內容,看看是否有大量的freeze record,方法參考如下:
《PostgreSQL 使用pg_xlogdump找到誤操作事務號》
《PostgreSQL xlog dump - pg_xlogdump 源碼講解》
預防freeze風暴
《PostgreSQL的"天氣預報" - 如何預測Freeze IO風暴》
《PostgreSQL 大表自動 freeze 優化思路》
內核改進
《PostgreSQL 9.6 vacuum freeze大幅性能提升 代碼淺析》
參考
《如何追溯 PostgreSQL 慢查詢當時的狀態》
《PostgreSQL的"天氣預報" - 如何預測Freeze IO風暴》
《PostgreSQL 大表自動 freeze 優化思路》
《PostgreSQL 9.6 vacuum freeze大幅性能提升 代碼淺析》
總結
以上是生活随笔為你收集整理的Freeze 风暴导致的IOPS飙升 - 追溯与解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【译】Facebook 开源 Detec
- 下一篇: 奥数之“牛吃草问题”C++实现