2

我们有一个只产生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
4

2 回答 2

4

如果你看这个:

autovacuum: VACUUM skytf.urs_user_log_201105 (to prevent wraparound)

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

vacuum_freeze_min_age您可以使用,来控制它的行为vacuum_freeze_max_ageautovacuum无论您是否已禁用,您都无法禁用这种类型autovacuum

于 2012-07-30T04:15:48.673 回答
1

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

如果没记错的话,autovacuum 实际上会做两件事:

  • 真空
  • 分析

如果您只获得插入,则第一个不会启动。但是当 PG 认为统计数据可能发生了一些变化时,第二个继续这样做。

于 2011-06-15T10:58:03.047 回答