天天看点

影响或控制PostgreSQL垃圾回收的参数或因素

postgresql , 垃圾回收 , 参数 , freeze

哪些参数或因素将影响或控制postgresql的垃圾回收呢?

1、控制vacuum命令的睡眠时间,当vacuum的阶段性cost大于vacuum_cost_limit时,睡眠一段时间后继续。

2、vacuum时,不同数据块(在shared buffer中命中的块、未命中的块、脏块)的成本

3、vacuum阶段性cost阈值

4、对只读事务设置的超时时间,防止long sql带来的膨胀

5、在ckpt后第一次产生或变更的脏块,是否记录整个数据块的内容到wal中。

6、是否开启wal压缩

7、自动垃圾回收相关进程

1、数据库不能回收long sql事务快照后产生的垃圾,也即是说,数据库中最老的事务,决定了数据库可以回收的垃圾上限。在此事务快照后产生的垃圾都无法被回收。

2、snapshot too old,开启这个参数后,只读事务的允许时间超过这个时间后,将自动回滚。防止long sql引起的膨胀。

3、备库开启了hot_standby_feedback = on时,备库如果运行long sql,也会导致主库垃圾回收受限。导致膨胀。同时如果naptime很小,则可能导致频繁的无效vacuum发生,导致数据库的io,cpu飙高。

4、freeze是扫描全表的动作,如果大表发生freeze,可能导致大量的数据文件读写io,以及wal的写io。通过wal日志分析,可以找到freeze的蛛丝马迹。

5、如果主库设置了vacuum_defer_cleanup_age 大于 0 ,可能导致膨胀,同时如果naptime很小,则可能导致频繁的无效vacuum发生,导致数据库的io,cpu飙高。