如何解决为什么自动真空处理需要这么多内存和交换内存?
| 我们有一个产品日志数据库,该数据库仅生成插入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认为统计数据可能有所变化时,第二个继续这样做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。