You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aurora PostgreSQL系统表autovacuum长时间运行问题求助

Aurora PostgreSQL autovacuum长期运行致高StorageIOUsage问题诊断与解决

问题背景

在规格为db.t3.medium的Aurora PostgreSQL 10.17实例上,autovacuum进程已持续运行超过1个月,占用大量Aurora:StorageIOUsage资源。通过执行以下SQL确认,该进程正针对pg_depend、pg_attribute及pg_toast_2618等系统表进行清理:

SELECT * FROM pg_stat_activity WHERE wait_event_type = 'IO';

从pg_stat_sys_tables数据来看,这些系统表存在大量死元组,初步推测该现象与从生产环境恢复数据库的操作有关。曾考虑升级实例规格,但无法确定是否有效,需排查死元组堆积及autovacuum耗时过长的根本原因,以降低存储IO成本。

当前autovacuum配置

=> SELECT * FROM pg_catalog.pg_settings WHERE name LIKE '%autovacuum%';
                name                 |  setting  | unit |              category               |                                        short_desc                                         |                                                             extra_desc                                                             |  context   | vartype |       source       | min_val |  max_val   |                                        enumvals                                         | boot_val  | reset_val |            sourcefile             | sourceline | pending_restart 
-------------------------------------+-----------+------+-------------------------------------+-------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+------------+---------+--------------------+---------+------------+-----------------------------------------------------------------------------------------+-----------+-----------+-----------------------------------+------------+-----------------
 autovacuum                          | on        |      | Autovacuum                          | Starts the autovacuum subprocess.                                                         |                                                                                                                                    | sighup     | bool    | configuration file |         |            |                                                                                         | on        | on        | /rdsdbdata/config/postgresql.conf |         78 | f
 autovacuum_analyze_scale_factor     | 0.05      |      | Autovacuum                          | Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples. |                                                                                                                                    | sighup     | real    | configuration file | 0       | 100        |                                                                                         | 0.1       | 0.05      | /rdsdbdata/config/postgresql.conf |         55 | f
 autovacuum_analyze_threshold        | 50        |      | Autovacuum                          | Minimum number of tuple inserts, updates, or deletes prior to analyze.                    |                                                                                                                                    | sighup     | integer | default            | 0       | 2147483647 |                                                                                         | 50        | 50        |                                   |            | f
 autovacuum_freeze_max_age           | 200000000 |      | Autovacuum                          | Age at which to autovacuum a table to prevent transaction ID wraparound.                  |                                                                                                                                    | postmaster | integer | default            | 100000  | 2000000000 |                                                                                         | 200000000 | 200000000 |                                   |            | f
 autovacuum_max_workers              | 3         |      | Autovacuum                          | Sets the maximum number of simultaneously running autovacuum worker processes.            |                                                                                                                                    | postmaster | integer | configuration file | 1       | 262143     |                                                                                         | 3         | 3         | /rdsdbdata/config/postgresql.conf |         45 | f
 autovacuum_multixact_freeze_max_age | 400000000 |      | Autovacuum                          | Multixact age at which to autovacuum a table to prevent multixact wraparound.             |                                                                                                                                    | postmaster | integer | default            | 10000   | 2000000000 |                                                                                         | 400000000 | 400000000 |                                   |            | f
 autovacuum_naptime                  | 5         | s    | Autovacuum                          | Time to sleep between autovacuum runs.                                                    |                                                                                                                                    | sighup     | integer | configuration file | 1       | 2147483    |                                                                                         | 60        | 5         | /rdsdbdata/config/postgresql.conf |          9 | f
 autovacuum_vacuum_cost_delay        | 5         | ms   | Autovacuum                          | Vacuum cost delay in milliseconds, for autovacuum.                                        |                                                                                                                                    | sighup     | integer | configuration file | -1      | 100        |                                                                                         | 20        | 5         | /rdsdbdata/config/postgresql.conf |         73 | f
 autovacuum_vacuum_cost_limit        | -1        |      | Autovacuum                          | Vacuum cost amount available before napping, for autovacuum.                              |                                                                                                                                    | sighup     | integer | default            | -1      | 10000      |                                                                                         | -1        | -1        |                                   |            | f
 autovacuum_vacuum_scale_factor      | 0.1       |      | Autovacuum                          | Number of tuple updates or deletes prior to vacuum as a fraction of reltuples.            |                                                                                                                                    | sighup     | real    | configuration file | 0       | 100        |                                                                                         | 0.2       | 0.1       | /rdsdbdata/config/postgresql.conf |         22 | f
 autovacuum_vacuum_threshold         | 50        |      | Autovacuum                          | Minimum number of tuple updates or deletes prior to vacuum.                               |                                                                                                                                    | sighup     | integer | default            | 0       | 2147483647 |                                                                                         | 50        | 50        |                                   |            | f
 autovacuum_work_mem                 | -1        | kB   | Resource Usage / Memory             | Sets the maximum memory to be used by each autovacuum worker process.                     |                                                                                                                                    | sighup     | integer | default            | -1      | 2147483647 |                                                                                         | -1        | -1        |                                   |            | f
 log_autovacuum_min_duration         | -1        | ms   | Reporting and Logging / What to Log | Sets the minimum execution time above which autovacuum actions will be logged.            | Zero prints all actions. -1 turns autovacuum logging off.                                                                          | sighup     | integer | default            | -1      | 2147483647 |                                                                                         | -1        | -1        |                                   |            | f
 rds.force_autovacuum_logging_level  | disabled  |      | Customized Options                  | Emit autovacuum log messages irrespective of other logging configuration.                 | Each level includes all the levels that follow it.Set to disabled to disable this feature and fall back to using log_min_messages. | sighup     | enum    | default            |         |            | {debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic,disabled} | disabled  | disabled  |                                   |            | f

根源定位

进一步排查后发现:所有环境均创建了用于外部数据复制的复制槽,但仅部分环境实际消费这些槽。对于未被消费的复制槽,PostgreSQL会强制保留所有相关死元组,以确保复制进程能获取到所需数据,这直接导致autovacuum无法对系统表的死元组进行有效清理,进而引发autovacuum长期运行、IO资源持续高占用的问题。

解决方案

删除所有未被消费的复制槽后,autovacuum恢复正常清理能力,死元组被逐步回收,Aurora:StorageIOUsage资源占用显著降低,问题得到彻底解决。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:15:37