为什么autovacuum进程需要如此多的内存和交换内存?

时间:2011-06-15 09:07:22

标签: postgresql autovacuum

我们有一个只生成insert sql的产品日志数据库。但我们发现了 autovacuum过程耗费了大量内存。峰值时大约需要16 GB 约每2个月发生一次。下面是细节信息,任何人都知道吗?

表skytf.urs_user_log_201105只有插入操作,没有 更新,删除操作,所以我认为该表没有死元组!但为什么autovacuum 进程占用了大量内存?

--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  

从上面可以看出,autovacuum过程大约需要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

2 个答案:

答案 0 :(得分:4)

如果你看一下:

autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)

这不是常规的autovacuum。它正在运行以防止事务环绕。这种autovacuum必须在事务id超过20亿之前运行。在这里阅读更多内容: http://www.postgresql.org/docs/8.3/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND

您可以使用vacuum_freeze_min_agevacuum_freeze_max_age控制其行为。您是否已禁用autovacuum,无法禁用此类autovacuum

答案 1 :(得分:1)

  

只有插入操作,并且没有更新,删除操作,所以我认为该表没有死元组!

如果内存服务,autovacuum实际上会做两件事:

  • 真空
  • 分析

如果您只获得插入,第一个不会开始。但是,当PG认为统计数据可能有所改变时,第二种情况仍在继续。