问题描述
|
我们有一个产品日志数据库,该数据库仅生成插入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认为统计数据可能有所变化时,第二个继续这样做。