在执行VACUUM和ANALYZE命令时,系统会维护一个内部计数器,统计IO操作的估算COST。
当这个估算的COST达到一个指定值(vacuum_cost_limit),那么VACUUM或ANALYZE进程会sleep一个稍短的时间,
这个时间由vacuum_cost_delay指定。
然后重置这个计数器并继续进行之前的操作。

这项功能允许管理员降低这些命令对并发数据库进程的IO影响。
很多情况下这些操作并不需要很快完成,但更重要的是不要影响其他数据库操作的性能。
Cost-based vacuum delay提供了达到这个目标的方法。

手动执行VACUUM时,该功能是关闭的,将vacuum_cost_delay设置为非0值启用该功能。

配置项

说明

 vacuum_cost_delay

时间长度,单位是毫秒,表示当cost limit达到时,进程sleep的时间。默认值0,表示禁用该功能。在有些系统上,该值的精度为10ms,如果设置为非10的整数倍,那么将采用该配置值最大的10的整数倍的值,例如设置为199,那么采用200为设置值。

当使用cost-based vacuuming,该项的合理设置一般都很小,大概10ms20ms的样子。

vacuum_cost_page_hit

清除共享缓存中一个buffer的估算cost

这代表了lock buffer pool、查找共享hash表以及扫描这个page内容的cost

默认值是1

vacuum_cost_page_miss

清除一个需要从disk读取的buffer的估算cost

这代表了lock buffer pool、查找共享hash表、从disk读取这个块以及扫描它的内容的effort

默认值是10

vacuum_cost_page_dirty

修改被清理过的块时的估算cost charged

表示再次将这个脏块刷新到磁盘所需的额外I/O

默认值是20

vacuum_cost_limit

触发vacuum进程sleep的累积值。

默认是200


Note

There are certain operations that hold critical locks and should therefore complete as quickly as possible. Cost-based vacuum delays do not occur during such operations. Therefore it is possible that the cost accumulates far higher than the specified limit. To avoid uselessly long delays in such cases, the actual delay is calculated as vacuum_cost_delay * accumulated_balance / vacuum_cost_limit with a maximum of vacuum_cost_delay * 4.

有一些持有高级锁的重要操作需要尽快的完成,在这些操作过程当中,不会触发cost-based vacuum delay。因此,有可能cost远高于指定的limit。为了防止这种情况下的uselessly long delays,实际delay的计算方式建议为:  vacuum_cost_delay * accumulated_balance / vacuum_cost_limit with a maximum of vacuum_cost_delay * 4


  • No labels