On Wed, May 26, 2021 at 4:01 AM Masahiko Sawada <sawada.m...@gmail.com> wrote:
> On Wed, Apr 14, 2021 at 11:17 PM Mead, Scott <me...@amazon.com> wrote: > > > > > > > > > On Mar 1, 2021, at 8:43 PM, Masahiko Sawada <sawada.m...@gmail.com> > wrote: > > > > > > CAUTION: This email originated from outside of the organization. Do > not click links or open attachments unless you can confirm the sender and > know the content is safe. > > > > > > > > > > > > On Mon, Feb 8, 2021 at 11:49 PM Mead, Scott <me...@amazon.com> wrote: > > >> > > >> Hello, > > >> I recently looked at what it would take to make a running > autovacuum pick-up a change to either cost_delay or cost_limit. Users > frequently will have a conservative value set, and then wish to change it > when autovacuum initiates a freeze on a relation. Most users end up > finding out they are in ‘to prevent wraparound’ after it has happened, this > means that if they want the vacuum to take advantage of more I/O, they need > to stop and then restart the currently running vacuum (after reloading the > GUCs). > > >> > > >> Initially, my goal was to determine feasibility for making this > dynamic. I added debug code to vacuum.c:vacuum_delay_point(void) and found > that changes to cost_delay and cost_limit are already processed by a > running vacuum. There was a bug preventing the cost_delay or cost_limit > from being configured to allow higher throughput however. > > >> > > >> I believe this is a bug because currently, autovacuum will > dynamically detect and increase the cost_limit or cost_delay, but it can > never decrease those values beyond their setting when the vacuum began. > The current behavior is for vacuum to limit the maximum throughput of > currently running vacuum processes to the cost_limit that was set when the > vacuum process began. > > > > > > Thanks for your report. > > > > > > I've not looked at the patch yet but I agree that the calculation for > > > autovacuum cost delay seems not to work fine if vacuum-delay-related > > > parameters (e.g., autovacuum_vacuum_cost_delay etc) are changed during > > > vacuuming a table to speed up running autovacuums. Here is my > > > analysis: > > > > > > I appreciate your in-depth analysis and will comment in-line. That > said, I still think it’s important that the attached path is applied. As > it is today, a simple few lines of code prevent users from being able to > increase the throughput on vacuums that are running without having to > cancel them first. > > > > The patch that I’ve provided allows users to decrease their > vacuum_cost_delay and get an immediate boost in performance to their > running vacuum jobs. > > > > > > > > > > Suppose we have the following parameters and 3 autovacuum workers are > > > running on different tables: > > > > > > autovacuum_vacuum_cost_delay = 100 > > > autovacuum_vacuum_cost_limit = 100 > > > > > > Vacuum cost-based delay parameters for each workers are follows: > > > > > > worker->wi_cost_limit_base = 100 > > > worker->wi_cost_limit = 66 > > > worker->wi_cost_delay = 100 > > Sorry, worker->wi_cost_limit should be 33. > > > > > > > Each running autovacuum has "wi_cost_limit = 66" because the total > > > limit (100) is equally rationed. And another point is that the total > > > wi_cost_limit (198 = 66*3) is less than autovacuum_vacuum_cost_limit, > > > 100. Which are fine. > > So the total wi_cost_limit, 99, is less than autovacuum_vacuum_cost_limit, > 100. > > > > > > > Here let's change autovacuum_vacuum_cost_delay/limit value to speed up > > > running autovacuums. > > > > > > Case 1 : increasing autovacuum_vacuum_cost_limit to 1000. > > > > > > After reloading the configuration file, vacuum cost-based delay > > > parameters for each worker become as follows: > > > > > > worker->wi_cost_limit_base = 100 > > > worker->wi_cost_limit = 100 > > > worker->wi_cost_delay = 100 > > > > > > If we rationed autovacuum_vacuum_cost_limit, 1000, to 3 workers, it > > > would be 333. But since we cap it by wi_cost_limit_base, the > > > wi_cost_limit is 100. I think this is what Mead reported here. > > > > > > Yes, this is exactly correct. The cost_limit is capped at the > cost_limit that was set during the start of a running vacuum. My patch > changes this cap to be the max allowed cost_limit (10,000). > > The comment of worker's limit calculation says: > > /* > * We put a lower bound of 1 on the cost_limit, to avoid division- > * by-zero in the vacuum code. Also, in case of roundoff trouble > * in these calculations, let's be sure we don't ever set > * cost_limit to more than the base value. > */ > worker->wi_cost_limit = Max(Min(limit, > worker->wi_cost_limit_base), > 1); > > If we use the max cost_limit as the upper bound here, the worker's > limit could unnecessarily be higher than the base value in case of > roundoff trouble? I think that the problem here is rather that we > don't update wi_cost_limit_base and wi_cost_delay when rebalancing the > cost. > Currently, vacuum always limits you to the cost_limit_base from the time that your vacuum started. I'm not sure why, I don't believe it's rounding related because the rest of the rebalancing code works properly. ISTM that looking simply allowing the updated cost_limit is a simple solution since the rebalance code will automatically take it into account. > > Regards, > > -- > Masahiko Sawada > EDB: https://www.enterprisedb.com/ > > > -- -- Scott Mead *sc...@meads.us <sc...@meads.us>*