我们有一个只生成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
答案 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_age
,vacuum_freeze_max_age
控制其行为。您是否已禁用autovacuum
,无法禁用此类autovacuum
。
答案 1 :(得分:1)
只有插入操作,并且没有更新,删除操作,所以我认为该表没有死元组!
如果内存服务,autovacuum实际上会做两件事:
如果您只获得插入,第一个不会开始。但是,当PG认为统计数据可能有所改变时,第二种情况仍在继续。