为什么自动真空处理需要这么多内存和交换内存?

问题描述

| 我们有一个产品日志数据库,该数据库生成插入sql。但是我们发现 autovacuum过程占用了很多内存。高峰时大约需要16 GB,并且 大约每2个月发生一次。以下是详细信息,有人知道吗? 并且表skytf.urs_user_log_201105仅具有插入操作,而没有 更新,删除操作,所以我认为该表没有死元组!但是为什么要自动抽真空 进程在表上占用了太多内存?
--top detail 
top - 16:39:46 up 225 days,1:12,1 user,load average: 1.29,1.51,1.52
Tasks: 341 total,2 running,339 sleeping,0 stopped,0 zombie
cpu(s):  4.8%us,5.3%sy,0.0%ni,85.5%id,4.1%wa,0.0%hi,0.4%si,0.0%st

  PID USER      PR  NI  VIRT  RES  SHR S %cpu %MEM    TIME+  COMMAND                                                                
29267 postgres  14  -1 27.0g  16g 2928 S  1.0 72.2 199:59.74 postgres: autovacuum launcher process  
从上面可以看出,自动真空处理大约有16 gb;
--current sql
postgres=# select datname,current_query from pg_stat_activity where current_query !=\'<IDLE>\';
 datname  |                                    current_query                                    
----------+-------------------------------------------------------------------------------------
 skytf   | autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)




--table size
 skytf=> \\dt+ urs_user_log_201105
                          List of relations
 Schema |        Name         | Type  | Owner  | Size  | Description 
--------+---------------------+-------+--------+-------+-------------
 skytf | urs_user_log_201105 | table | skytf | 62 GB | 
(1 row)

--memory state
postgres@logdb-> free -m
             total       used       free     shared    buffers     cached
Mem:         24104      24028         75          0          4       5545
-/+ buffers/cache:      18479       5625
Swap:        16386       8824       7561
    

解决方法

        如果你看这个:
autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)
这不是常规的自动真空。它正在运行以防止事务回绕。这种自动清理必须在交易ID超过20亿之前运行。在这里阅读更多: http://www.postgresql.org/docs/8.3/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND 您可以用
vacuum_freeze_min_age
vacuum_freeze_max_age
控制它的行为。无论是否已禁用
autovacuum
,都不能禁用这种
autovacuum
。     ,           只有插入操作,并且没有更新,删除操作,所以我认为该表没有死元组! 如果有内存,自动清理实际上会做两件事: 真空 分析 如果您只获得插入件,则第一个不会插入。但是当PG认为统计数据可能有所变化时,第二个继续这样做。