更新时间:2024-11-12 GMT+08:00
分享

自动清理

系统自动清理线程(autovacuum)包含VACUUM和ANALYZE两个过程,回收被标识为删除状态的记录空间,并更新表的统计数据。两次autovacuum的执行间隔时间由参数autovacuum_naptime控制,默认时间为10分钟,可根据实际业务场景进行配置。该间隔时间不能保证完全精确,一方面取决于环境的硬件条件和负载,当负载较高时,可能由于需要清理的数据量较大,造成延迟;另一方面取决于相关参数autovacuum_naptime和autovacuum_max_workers的配置值,autovacuum_naptime为执行间隔时间,配置值越小,执行间隔越小,但由于涉及数据的清理和统计信息的计算,占用的CPU、内存和I/O开销均会增大;autovacuum_max_workers为同时运行的自动清理线程的最大数量,配置值越大,执行间隔越符合autovacuum_naptime的配置,但占用的CPU、内存和I/O开销同样会增大。

此外,可以通过配置immediate_analyze_threshold参数,在新增数据量超过阈值时触发ANALYZE。阈值的计算方式见immediate_analyze_threshold的参数说明。

autovacuum

参数说明:控制数据库自动清理线程(autovacuum)的启动。自动清理线程运行的前提是将track_counts设置为on。

参数类型:布尔型

参数单位:

取值范围:

  • on:表示开启数据库自动清理线程。
  • off:表示关闭数据库自动清理线程。

默认值:on

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:

  • 如果希望系统在故障恢复后,具备自动清理两阶段事务的功能,请将autovacuum设置为on;
  • 当设置autovacuum为on,autovacuum_max_workers为0时,表示系统不会自动进行autovacuum,只会在故障恢复后自动清理两阶段事务;
  • 当设置autovacuum为on,autovacuum_max_workers大于0时,表示系统不仅会在故障恢复后自动清理两阶段事务,还可以自动进行autovacuum。

设置不当的风险与影响:在ASTORE表中,关闭该参数会导致表中有过多的不活跃行存在,可能会影响查询性能。

autovacuum_mode

参数说明:该参数仅在autovacuum设置为on的场景下生效,它控制autoanalyze和autovacuum的打开情况。

参数类型:枚举类型

参数单位:

取值范围:

  • analyze:表示只做autoanalyze。
  • vacuum:表示只做autovacuum。
  • mix:表示autoanalyze和autovacuum都做。
  • none:表示autoanalyze和autovacuum都不做。

默认值:mix

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

autoanalyze_timeout

参数说明:设置autoanalyze的超时时间。在对某张表做autoanalyze时,如果该表的analyze时长超过了autoanalyze_timeout,则自动取消该表此次analyze。

参数类型:整型

参数单位:秒(s)

取值范围:0 ~ 2147483,0表示没有超时限制。

默认值:300

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:设置值取决于数据库的负载和性能需求。如果数据库的负载较轻,可以适当地将autoanalyze_timeout设置大些,以便自动分析操作有足够的时间来完成。如果数据库的负载较重,则应该将autoanalyze_timeout设置小些,以便自动分析操作可以在短时间内完成,从而避免影响其他重要的数据库操作。

设置不当的风险与影响:autoanalyze操作会消耗一定的系统资源,如果该参数设置太大,可能会导致系统资源被过度消耗,从而影响数据库的性能。如果设置太小,autoanalyze操作可能无法完成,可能会导致统计信息不准确,从而影响查询的执行计划和性能。

autovacuum_io_limits

参数说明:控制autovacuum线程每秒触发I/O的上限。

参数类型:整型

参数单位:

取值范围:-1 ~ 1073741823。其中-1表示不控制,而是使用系统默认控制组。

默认值:-1

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:

  • 服务器有足够的磁盘I/O资源,可以将autovacuum_io_limits设置为较高的值,这将允许autovacuum线程更快地完成清理操作。
  • 服务器磁盘I/O资源有限,可以将autovacuum_io_limits设置为较低的值。这将限制autovacuum线程使用的磁盘I/O资源,以避免对其他线程的影响。

设置不当的风险与影响:

  • 设置为过高的值,可能会导致autovacuum线程使用过多的磁盘I/O资源,从而影响其他线程的性能。
  • 设置为过低的值,可能会导致autovacuum线程无法有效地清理表数据,从而导致表数据过度膨胀,影响数据库性能。

log_autovacuum_min_duration

参数说明:当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录自动清理执行的每一步操作。设置此选项有助于追踪自动清理的行为。

举例如下:将log_autovacuum_min_duration设置为250ms,表示记录所有运行大于或者等于250ms的自动清理命令的相关信息。

参数类型:整型

参数单位:毫秒(ms)

取值范围:-1 ~ 2147483647

  • 当参数设置为0时,表示所有的自动清理操作都记录到日志中。
  • 当参数设置为-1时,表示所有的自动清理操作都不记录到日志中。
  • 当参数设置大于等于0时,当由于锁冲突的存在导致一个自动清理操作被跳过,记录一条消息(记录跳过autovacuum原因,便于审计)。

默认值:-1

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。例如,不带单位取值600,表示log_autovacuum_min_duration为600ms;带单位取值10min,表示log_autovacuum_min_duration为10min。取值如果要带单位,必须为ms、s、min、h、d。

置建议:一般默认为-1。如果需要监控自动VACUUM操作的性能,可以将log_autovacuum_min_duration设置为一个大于0的值,以记录持续时间超过该值的自动VACUUM操作的日志信息。

设置不当的风险与影响:如果设置为0或者过小,则可能会记录大量的日志信息,影响系统性能;如果设置过大,可能无法及时感知自动清理时间过久,导致清理速度不足或异常情况。

autovacuum_max_workers

参数说明:设置能同时运行的自动清理线程的最大数量,该参数的取值上限与GUC参数max_connectionsjob_queue_processes大小有关。

参数类型:整型

参数单位:

取值范围:最小值为0(表示不会自动进行autovacuum),理论最大值为262143,实际最大值为动态值,计算公式为“262143 - max_inner_tool_connections - max_connections - max_concurrent_autonomous_transactions - job_queue_processes - 辅助线程数 – autovacuum的launcher线程数 - 1”,其中辅助线程数和autovacuum的launcher线程数由两个宏来指定,当前版本的默认值分别为20和2。

默认值:3

设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:此参数设置越大,自动清理功能创建的线程数越多,占用的系统CPU和内存资源越多,所以设置时不建议设置过大,避免由于此参数设置过大导致内存无法分配或者占用过多CPU资源,导致数据库启动报错或业务受到影响。如果将该参数设置得过低,可能会导致autovacuum线程无法及时清理和回收不再使用的表空间,从而导致数据库膨胀和性能下降。

autovacuum_naptime

参数说明:设置两次自动清理操作的时间间隔。

参数类型:整型

参数单位:秒(s)

取值范围:1 ~ 2147483。

默认值:600(即10min)

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。例如,不带单位取值600,表示autovacuum_naptime为600s;带单位取值10min,表示autovacuum_naptime为10min。取值如果要带单位,必须为s、min、h、d。

设置建议:仅用Ustore表时推荐使用默认值。对于Astore表,设置值取决于用户的数据库环境和应用程序负载。如果数据库环境中有大量表的更新或删除操作,建议将该参数设置为较短的时间间隔,以确保及时清理无用的数据并避免数据库空间不足的情况。如果数据库环境中的更新或删除操作较少,则可以将该参数设置为较长的时间间隔,以减少自动清理线程的开销。

设置不当的风险与影响:

  • 如果将autovacuum_naptime设置为过短的时间间隔,可能会导致autovacuum线程的开销过大,从而影响数据库的性能。
  • 如果将autovacuum_naptime设置为过长的时间间隔,可能会导致无用的数据堆积,从而占用数据库空间,影响数据库的性能。

autovacuum_vacuum_threshold

参数说明:触发对ASTORE表VACUUM操作的删除或更新元组的最小数量值。触发VACUUM的阈值=autovacuum_vacuum_threshold+reltuples(表上元组的个数)* autovacuum_vacuum_scale_factor。当表上被删除或更新的记录数超过阈值时,才会对这个表执行VACUUM操作。

参数类型:整型

参数单位:

取值范围:0 ~ 2147483647

默认值:50

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:在ASTORE表中:

  • 该参数设置得过低,会导致频繁的VACUUM操作,增加系统开销,降低性能。
  • 该参数设置得过高,会导致表中过多的死亡行存在,可能会影响查询性能。

autovacuum_analyze_threshold

参数说明:触发对ASTORE表ANALYZE操作的删除、插入或更新元组的最小数量值。触发ANALYZE的阈值=autovacuum_analyze_threshold+reltuples(表上元组的个数)* autovacuum_analyze_scale_factor。当表上被删除、插入或更新的记录数超过阈值时,才会对这个表执行ANALYZE操作。

参数类型:整型

参数单位:

取值范围:0 ~ 2147483647

默认值:50

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:

  • 该参数设置得过低,会导致频繁的ANALYZE操作,增加系统开销,降低性能。
  • 该参数设置得过高,表中的统计信息可能会过时,从而导致查询计划不准确,影响查询性能。

autovacuum_vacuum_scale_factor

参数说明:VACUUM时表的规模因子,用于计算触发VACUUM的阈值。触发VACUUM的阈值=autovacuum_vacuum_threshold+reltuples(表上元组的个数)*autovacuum_vacuum_scale_factor。当表上被删除或更新的记录数超过阈值时,才会对这个表执行VACUUM操作。

参数类型:浮点型

参数单位:

取值范围:0.0 ~ 100.0

默认值:0.2

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:设置值取决于ASTORE表的负载和使用情况;如果是高写入负载的,则用户需要将该参数设置得更低,以便更频繁地清理表以避免性能下降。另一方面,如果是高读取负载的,则可以将该参数设置得更高,以避免在读取时不必要地浪费资源。

设置不当的风险与影响:在ASTORE表中:

  • 该参数设置得太低,那么autovacuum线程可能会过于频繁地清理表,导致性能下降。
  • 该参数设置得太高,那么表可能无法及时清理,会变得非常大,占用过多的磁盘空间。

autovacuum_analyze_scale_factor

参数说明:ANALYZE时表的规模因子,用于计算触发ANALYZE的阈值。触发ANALYZE的阈值=autovacuum_analyze_threshold+reltuples(表上元组的个数)*autovacuum_analyze_scale_factor。当表上被删除、插入或更新的记录数超过阈值时,才会对这个表执行ANALYZE操作。

参数类型:浮点型

参数单位:

取值范围:0.0 ~ 100.0

默认值:0.1

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:

  • 该参数设置得过低,会导致频繁的ANALYZE操作,增加系统开销,降低性能。
  • 该参数设置得过高,可能会导致ANALYZE的频率过低,表中的统计信息可能会过时,从而导致查询计划不准确,影响查询性能。

autovacuum_freeze_max_age

参数说明:指定ASTORE表pg_class.relfrozenxid字段在超过多少个事务后,会强制执行VACUUM操作。即使自动清理被禁用,系统也会启动AUTOVACUUM线程。清理操作还允许从pg_clog/子目录中删除旧文件。

参数类型:整型

参数单位:

取值范围:100000 ~ 576460752303423487

默认值:4000000000

设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。如果数据库中的ASTORE表经常进行大量的更新和删除操作,那么建议将该参数设置为较小的值,以便及时回收垃圾。如果数据库中的ASTORE表很少进行更新和删除操作,那么可以将该参数设置为较大的值,以减少自动垃圾回收的频率。

设置不当的风险与影响:在ASTORE表中:

  • 该参数设置得过低,会导致频繁的自动垃圾回收操作,增加系统开销,降低性能。
  • 该参数设置得过高,会导致自动垃圾回收的延迟,从而可能导致大量的无效数据占用磁盘空间,影响数据库性能。

autovacuum_vacuum_cost_delay

参数说明:设置在自动VACUUM操作里使用的开销延迟数值。

参数类型:整型

参数单位:毫秒(ms)

取值范围:-1 ~ 100。其中-1表示使用常规的vacuum_cost_delay

默认值:20

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

autovacuum_vacuum_cost_limit

参数说明:设置在自动VACUUM操作里使用的开销限制数值。

参数类型:整型

参数单位:

取值范围:-1 ~ 10000。其中-1表示使用常规的vacuum_cost_limit

默认值:-1

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

defer_csn_cleanup_time

参数说明:用来指定本地回收时间间隔。defer_csn_cleanup_time参数用于控制系统何时清理已过期的CSN信息,指定了系统在多长时间内保留已过期的CSN信息。

参数类型:整型

参数单位:ms

取值范围:0 ~ 2147483647

默认值5000(即5s)

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。如果系统的负载较轻,可以将defer_csn_cleanup_time设置为较长的时间。如果系统的负载较重,建议将defer_csn_cleanup_time设置为较短的时间。这样可以确保系统在忙碌时也能保持良好的性能。

设置不当的风险与影响:如果设置得太短,系统可能会频繁地清理已过期的CSN信息,从而导致性能下降。如果设置得太长,系统可能会占用过多的内存,从而导致系统变慢或崩溃。

对自动清理进行参数调优

AUTOVACUUM清理速度与autovacuum_vacuum_cost_delay、autovacuum_vacuum_cost_limit等参数强相关,当业务表进行高并发写入时,使用默认的参数配置可能会出现AUTOVACUUM清理速度跟不上表空间膨胀场景,导致空间膨胀、性能下降等。例如,对Astore表进行高并发更新、插入删除,尤其是含有全局分区索引的大分区表(需要多次扫描清理全局分区索引),因此建议业务定时巡检确认空间膨胀情况,并对AUTOVACUUM参数进行针对性调优或定时在业务低峰期执行手动VACUUM,避免空间持续膨胀。

对大表的自动清理参数进行调优

AUTOVACUUM基于死亡元组百分比确认是否对特定表进行清理(详见自动清理规模因子参数autovacuum_vacuum_scale_factor,因此,对于元组较多的大表,默认参数下相对较难触发自动清理(例如表中元组超过一亿,死亡元组数量超过两千万才能触发一次清理),对于这种情况,可适当降低自动清理的规模因子,例如,可通过下面的方式进行手动调优:
ALTER TABLE table_name SET (autovacuum_vacuum_scale_factor = 0.05);
如果期望自动清理不依赖死亡元组的比例触发,而是依赖死亡元组数量触发,可单独调整自动清理的阈值与规模因子参数,例如,可通过以下方式手动调优,让指定表死亡元组达到一万时即可触发自动清理。
ALTER TABLE table_name SET (autovacuum_vacuum_threshold = 10000);
ALTER TABLE table_name SET (autovacuum_vacuum_scale_factor = 0.0);

对自动清理速率进行参数调优

  1. 确认是否需要调整自动清理参数
    • 通过运维视图查看指定表的死亡元组数与上一次自动清理时间等信息,当死亡元组远超自动清理阈值,并且距离上一次自动清理已经过去较长时间(例如一天),此时可基本确认当前实例需要手动调优自动清理参数。具体来说,可通过以下方式进行确认。
      -- 查看死亡元组信息:即查询结果中n_dead_tup字段;查看上一次自动清理时间,即查询结果中的last_autovacuum字段
      SELECT n_live_tup, n_dead_tup, last_autovacuum FROM pg_stat_user_tables WHERE relname = 'table_name';
      
      -- 获取表中元组信息
      SELECT reltuples FROM pg_class WHERE relname = 'table_name';

      通过公式:autovacuum_vacuum_threshold+reltuples(表上元组的个数)*autovacuum_vacuum_scale_factor计算autovacuum触发阈值(当手动配置了单表触发阈值时,需要替换以上参数为调整后的参数),确认计算结果是否远大于n_dead_tup。结合last_autovacuum查询结果确认是否长时间未执行AUTOVACUUM。

    • 结合数据库监控看板,确认数据库表空间膨胀长期趋势,如果膨胀率长时间超过20%,此时也需要进行手动参数调优。
  2. 调优方法
    在确认了空间存在持续膨胀风险后,需要考虑手动对AUTOVACUUM参数进行调优。
    • 自动清理速率的主要取决于autovacuum_vacuum_cost_delay与autovacuum_vacuum_cost_limit两个参数,默认情况下仅对这两个参数进行手动调优即可。一般来说,自动清理线程扫描页面期间会产生开销,每当开销达到autovacuum_vacuum_cost_limit,自动清理线程会休眠autovacuum_vacuum_cost_delay时间,因此,调高autovacuum_vacuum_cost_limit参数或降低autovacuum_vacuum_cost_delay参数均可以提升自动清理性能,并且,单独调整两种参数可以获得近似等比的清理速率提升,但相应的,会导致自动清理线程出现额外的I/O增长。建议分阶段多次调整,确保对业务的影响保持在可控范围内,例如,调整autovacuum_vacuum_cost_delay从20ms降低到10ms,观测系统I/O一小时内的变动,确保对业务的影响可控,并结合自动清理线程的执行日志确认清理速度情况,确认是否可以选择更为激进的调优策略。
    • 对确认存在空间膨胀风险的库或业务表,手动执行VACUUM进行清理,以便于快速提高空间复用能力,并结合业务数据情况,在业务低峰期执行表级VACUUM FULL。
    • 结合业务场景,对频繁更新、大量插入删除等操作的业务表,每天定时在业务低峰期执行手动VACUUM ANALYZE,以便于快速回收死亡元组,并让查询优化器在规划用户查询时有更好的选择。

相关文档