您现在的位置是: 网站首页 > 程序设计  > PostgreSQL 

PostgreSQL内核原理之VACUUM之GUC参数

2025年5月27日 23:50 180人围观

简介PostgreSQL必须依赖autovacuum来清理死元组,清理速度势必会影响系统的IO,因此P哦是通过热SQL提供了一系列参数用于控制autovacuum的执行效率

VACUUM相关参数

我们可以使用select name, min_val, max_val from pg_settings where name ilike '%vacuum%';来查看所有和VACUUM相关的参数,结果如下:

postgres=# select name, min_val, max_val, boot_val from pg_settings where name ilike '%vacuum%'; 
                 name                  | min_val |  max_val   |  boot_val   
---------------------------------------+---------+------------+------------ 
 autovacuum                            |         |            | on 
 autovacuum_analyze_scale_factor       | 0       | 100        | 0.1 
 autovacuum_analyze_threshold          | 0       | 2147483647 | 50 
 autovacuum_freeze_max_age             | 100000  | 2000000000 | 200000000 
 autovacuum_max_workers                | 1       | 262143     | 3 
 autovacuum_multixact_freeze_max_age   | 10000   | 2000000000 | 400000000 
 autovacuum_naptime                    | 1       | 2147483    | 60 
 autovacuum_vacuum_cost_delay          | -1      | 100        | 2 
 autovacuum_vacuum_cost_limit          | -1      | 10000      | -1 
 autovacuum_vacuum_insert_scale_factor | 0       | 100        | 0.2 
 autovacuum_vacuum_insert_threshold    | -1      | 2147483647 | 1000 
 autovacuum_vacuum_scale_factor        | 0       | 100        | 0.2 
 autovacuum_vacuum_threshold           | 0       | 2147483647 | 50 
 autovacuum_work_mem                   | -1      | 2147483647 | -1 
 log_autovacuum_min_duration           | -1      | 2147483647 | 600000 
 vacuum_buffer_usage_limit             | 0       | 16777216   | 256 
 vacuum_cost_delay                     | 0       | 100        | 0 
 vacuum_cost_limit                     | 1       | 10000      | 200 
 vacuum_cost_page_dirty                | 0       | 10000      | 20 
 vacuum_cost_page_hit                  | 0       | 10000      | 1 
 vacuum_cost_page_miss                 | 0       | 10000      | 2 
 vacuum_failsafe_age                   | 0       | 2100000000 | 1600000000 
 vacuum_freeze_min_age                 | 0       | 1000000000 | 50000000 
 vacuum_freeze_table_age               | 0       | 2000000000 | 150000000 
 vacuum_multixact_failsafe_age         | 0       | 2100000000 | 1600000000 
 vacuum_multixact_freeze_min_age       | 0       | 1000000000 | 5000000 
 vacuum_multixact_freeze_table_age     | 0       | 2000000000 | 150000000 
(27 rows) 

这里只介绍几个重要参数

  • autovacuum:这个是总开关,决定着是否开启AUTO VACUUM,但是需要注意的是,即使设置autovacuum=off 也可能会触发拉起Worker。
  • autovacuum_naptime:这个参数控制着Launcher检测拉起Worker的周期,注意的是这个值的真是意图时能够在naptime时间内对所有库都执行一轮清理,因此假设有N个库,那么Launcher每隔naptime/N的时间就会在一个库上拉起一个Worker
  • autovacuum_analyze_scale_factor、autovacuum_vacuum_scale_factor:这两个参数分别控制触发autoanalyze和autovacuum的阈值,分别是0.1和0.2,但这并不是说触发autovacuum的时候一定会触发autoanalyze,实际上他们的触发没有必然联系
  • autovacuum_analyze_threshold 、autovacuum_vacuum_threshold:这两个值是前面两个阈值的基准值,可以设置这两个值来控制小表的触发时机;
  • autovacuum_vacuum_cost_delay、autovacuum_vacuum_cost_limit:这两个参数控制着VACUUM的IO,由于VACUUM是需要读写页面,如果清理速度过快,则可能影响业务,用这两个参数实现IO控制;
  • vacuum_cost_page_hit、vacuum_cost_page_miss、vacuum_cost_page_dirty:这3个参数看着读写单个页面的cost,结合autovacuum_vacuum_cost_delay、autovacuum_vacuum_cost_limit两个参数,真实含义是当读写页面累加的cost到达limit时,需要睡眠delayms;
  • autovacuum_freeze_max_age、vacuum_freeze_min_age、vacuum_freeze_table_age:这三个参数控制着VACUUM的行为动作,下面详细介绍。