实例周期性的IO升高,是因为数据库周期性执行autovacuum所致。
这种情况通常是因为频繁的更新、修改,引起年龄的增长、或脏数据的产生,从而触发autovacuum进行回收。
1. 查询库的年龄
SELECT $$nos_db$$ AS env_name ,
Current_database(),
nspname,
CASE relkind
WHEN $$r$$ THEN $$ordinary table$$
WHEN $$t$$ THEN $$toast table$$
END AS relkind,
relname,
age(relfrozenxid),
CASE
WHEN (
substring(reloptions::text,$$autovacuum_freeze_max_age=(\d+)$$)::int8) IS NOT NULL THEN (substring(reloptions::text,$$autovacuum_freeze_max_age=(\d+)$$)::int8)-age(relfrozenxid)
ELSE
(
SELECT setting
FROM pg_settings
WHERE name=$$autovacuum_freeze_max_age$$)::int8 - age(relfrozenxid)
END AS age_remain
FROM pg_class t2
join pg_namespace t3
ON t2.relnamespace=t3.oid
WHERE t2.relkind IN ($$t$$,
$$r$$)
AND t2.relname LIKE 't_%'
ORDER BY age(relfrozenxid) DESC;
根据vacuum_freeze_min_age、autovacuum_freeze_max_age、vacuum_freeze_table_age等参数,判断是否是因为年龄触发的。 该文档中有说明 http://xmarker.blog.163.com/blog/static/2264840572014524112214193/
2. 如果年龄比较高,则执行vacuum freeze
vacuum freeze 的锁粒度较小,且执行较快。 参考中的vacuum freeze相关的介绍 http://www.postgres.cn/docs/9.3/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND
此时,可以解决由年龄触发的autovacuum。
3. 脏数据
经常更新,很容易造成脏数据,导致表的膨胀,请参考文档中的2.2部分 http://gitbook.cn/books/58db93b8f59193805502b491/index.html
可以先做下vacuum,然后看下表的空间占用是否会下降。必要的话,请做下vacuum full。
4. 业务维护
vacuum full可以解决当前频繁触发autovacuum的问题。正常情况下,autovacuum工作的很好,但鉴于当前业务更新量超大的情况,建议做好年龄和脏数据的监控,并及时处理。 或者在了解autovacuum的原理后,调整参数来适应业务,这个参考 http://www.postgres.cn/docs/9.3/runtime-config-autovacuum.html
参考:
1. 具体autovacuum的机制可以参考 http://www.postgres.cn/docs/9.3/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND
2. autovacuum相关参数 http://www.postgres.cn/docs/9.3/runtime-config-autovacuum.html
3. MVCC:
http://www.jasongj.com/sql/mvcc/
https://mp.weixin.qq.com/s?__biz=MzI5MTQ3ODU4Nw==&mid=2247483739&idx=1&sn=06e4ea74b2a94c277c89c0fa0aa58a0e
https://mp.weixin.qq.com/s/so-MaqrUtncT8pbRngUcDA
https://my.oschina.net/liuyuanyuangogo/blog/497929
http://www.jianshu.com/p/f73b9f36e555
4. checkpoint:
https://yq.aliyun.com/articles/72500
http://mysql.taobao.org/monthly/2017/04/04/
http://www.jianshu.com/p/a37ceed648a8
https://kb.cnblogs.com/page/76601/
5. 关于数据库中的年龄:
http://francs3.blog.163.com/blog/static/405767272012469589239
http://xmarker.blog.163.com/blog/static/2264840572014524112214193/
https://yq.aliyun.com/articles/50411
6. 可以参考的官方文档:
http://www.postgres.cn/docs/9.3/