接着上期说,在调整完几个常见的参数后,
还有如下的参数可以调整提高autovacuum 性能,转而提高你POSTGRESQL的性能
- autovacuum_vacuum_cost_limit : total cost limit autovacuum could reach (combined by all autovacuum jobs).
- autovacuum_vacuum_cost_delay : autovacuum will sleep for these many milliseconds when a cleanup reaching autovacuum_vacuum_cost_limit cost is done.
- vacuum_cost_page_hit : Cost of reading a page that is already in shared buffers and doesn’t need a disk read.
- vacuum_cost_page_miss : Cost of fetching a page that is not in shared buffers.
- vacuum_cost_page_dirty : Cost of writing to each page when dead tuples are found in it.
在此之前,有人问,是否可以关闭 track_counts 这个参数,回答是 NO NO NO ,为什么,因为如果你敢关闭这个参数,autovacuum 就敢不工作,原因为这个参数为统计整体数据库中的表的信息,如果你关闭这个参数,后台的stats collector 进程将无法给 autovacuum 进程下一次到底应该对那些表进行真空操作,此时autovacuum 就和瞎子一样,不知道该干什么了,所以这个参数是必然被打开的,不能关闭。
首先我们要确认的一个问题是autovacuum 会对8kb的数据页进行读取来修改或写入dead tuple的信息,对于比较大的表来说这是一个消耗I/O的操作,autovacuum 工作时可能是在业务的高峰期,如何能平衡autovacuum工作中尽量减少对业务高峰期性能的影响,就需要依靠下面的的这些参数了。
1 autovacuum_vacuum_cost_limit 控制预期autovacuum 的成本,达到这个成本后,我们就停止autovacuum的工作,这个值本身与workers 的数量有关,如果你有 3个 workers 则 这个值是除以 3 也就是 3个workers 的总和加在一起,不会超过这个值,所以如果你的workers 比较多,此时这个值就的设置的大一点,来应对你的更多的workers ,默认这个值是200
2 autovacuum_vacuum_cost_delay 在达成本后,autovacuum不工作需要等待多长时间然后再次工作。
当对于一个busy的系统,
1 添加 workers 可以从默认的 3个 变为 6个或更多
2 调整 autovacuum_vacuum_cost_limit , 以3个为200 的默认值当6配置为 6个workers 的时候可以调整参数为 400
3 调整 autovacuum_vacuum_cost_delay 的值从20ms 变为 15-10 ms 减少delay 的时间。
以上就是针对这几个参数的优化建议。当然如果数据库中的表的分布情况比较复杂,则autovacuum_vacuum_cost_limit 和 autovacuum_vacuum_cost_delay 这两个参数还是可以针对单表来进行调整的。
小结,调大workers的工作数量后,如果不调整 autovacuum_vacuum_cost_limit 的情况下,只能让你的autovacuum更慢。这就如同需要搭载汽车的人数增多,那么我们调高 works 相当于增加运输人的车辆数,但车辆数增加了,可道路没有拓宽,还是羊肠小道,那么车辆可能会拥塞到路上,所以增加车辆的同时还需要拓宽道路。
vacuum_cost_delay = 0
vacuum_cost_page_hit = 1
vacuum_cost_page_miss = 10
vacuum_cost_page_dirty = 20
vacuum_cost_limit = 200
上面的几个参数与vacuum 的成本计算有关, 这里
vacuum_cost_page_hit
vacuum_cost_page_miss
vacuum_cost_page_dirty
三个参数的的功能就是计算 vacuum 的成本,
vacuum_cost_page_hit 主要的是标准从share buffer中找到数据的成本
这里默认是 1
vacuum_cost_page_miss 这个参数主要标注的是在share buffer 中找不到数据的情况下,需要从磁盘读取数据的成本 这里默认是 10
vacuum_cost_page_dirty 最后这个参数要标注的是在share buffer 中无法找到数据,并且 share buffer 中无法在装入,需要将脏页刷到磁盘,在将磁盘的信息读入到share buffer 中的成本
可以从上图看到每一个值都有自己的默认的成本,接着上面的说,上面提到 vacuum 的成本是200 ,现在知道这个成本是怎么计算来的了吧。
那么调整autovacuum 加速他进行整理的方式主要有3个方法
1 调整大 autovacuum_vacuum_cost_limit 的值,这样真空触发cost 停止的次数就会大大减少
2 调整上面的三个参数,降低他们的值,也就变相提高了 autovacuum_vacuum_cost_limit
3 提高autovacuum 的 mem ,有效降低出现 autovacuum_vacuum_cost_limit 和 autovacuum_vacuum_cost_limit的情况。