Freeze 风暴导致的IOPS飙升 - 追溯与解法-阿里云开发者社区

开发者社区> 阿里云数据库> 正文
登录阅读全文

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_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 源码讲解》

预防freeze风暴

《PostgreSQL的"天气预报" - 如何预测Freeze IO风暴》

《PostgreSQL 大表自动 freeze 优化思路》

内核改进

《PostgreSQL 9.6 vacuum freeze大幅性能提升 代码浅析》

参考

《如何追溯 PostgreSQL 慢查询当时的状态》

《PostgreSQL的"天气预报" - 如何预测Freeze IO风暴》

《PostgreSQL 大表自动 freeze 优化思路》

《PostgreSQL 9.6 vacuum freeze大幅性能提升 代码浅析》

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里云数据库
使用钉钉扫一扫加入圈子
+ 订阅

帮用户承担一切数据库风险,给您何止是安心!

官方博客
链接