德哥
2018-01-27
1400浏览量
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_log
2、查看统计表,统计表记录了最后一次被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 源码讲解》
《PostgreSQL的"天气预报" - 如何预测Freeze IO风暴》
《PostgreSQL 9.6 vacuum freeze大幅性能提升 代码浅析》
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
帮用户承担一切数据库风险,给您何止是安心!