Hi,I like your idea,It would be even better if the weights could be taken
according to the larger tables

On Fri, 25 Apr 2025 at 22:03, Junwang Zhao <zhjw...@gmail.com> wrote:

> Hi hackers,
>
> After watching Robert's talk[1] on autovacuum and participating in the
> related
> workshop yesterday, it appears that people are inclined to use
> prioritization
> to address the issues highlighted in Robert's presentation. Here I list two
> of the failure modes that were discussed.
>
> - Spinning. Running repeatedly on the same table but not accomplishing
> anything useful.
> - Starvation. autovacuum can't vacuum everything that needs vacuuming.
> - ...
>
> The prioritization way needs some basic stuff that postgres doesn't have
> now.
>
> I had a random thought that introducing some randomness might help
> mitigate some of the issues mentioned above. Before performing vacuum
> on the collected tables, we could rotate the table_oids list by a random
> number within the range [0, list_length(table_oids)]. This way, every table
> would have an equal chance of being vacuumed first, thus no spinning and
> starvation.
>
> Even if there is a broken table that repeatedly gets stuck, this random
> approach would still provide opportunities for other tables to be vacuumed.
> Eventually, the system would converge.
>
> The change is something like the following, I haven't tested the code,
> just posted it here for discussion, let me know your thoughts.
>
> diff --git a/src/backend/postmaster/autovacuum.c
> b/src/backend/postmaster/autovacuum.c
> index 16756152b71..6dddd273d22 100644
> --- a/src/backend/postmaster/autovacuum.c
> +++ b/src/backend/postmaster/autovacuum.c
> @@ -79,6 +79,7 @@
>  #include "catalog/pg_namespace.h"
>  #include "commands/dbcommands.h"
>  #include "commands/vacuum.h"
> +#include "common/pg_prng.h"
>  #include "common/int.h"
>  #include "lib/ilist.h"
>  #include "libpq/pqsignal.h"
> @@ -2267,6 +2268,25 @@ do_autovacuum(void)
>
>            "Autovacuum Portal",
>
>            ALLOCSET_DEFAULT_SIZES);
>
> +       /*
> +        * Randomly rotate the list of tables to vacuum.  This is to avoid
> +        * always vacuuming the same table first, which could lead to
> spinning
> +        * on the same table or vacuuming starvation.
> +        */
> +       if (list_length(table_oids) > 2)
> +       {
> +               int rand = 0;
> +               static pg_prng_state prng_state;
> +               List       *tmp_oids = NIL;
> +
> +               pg_prng_seed(&prng_state, (uint64) (getpid() ^
> time(NULL)));
> +               rand = (int) pg_prng_uint64_range(&prng_state, 0,
> list_length(table_oids) - 1);
> +               if (rand != 0) {
> +                       tmp_oids = list_copy_tail(table_oids, rand);
> +                       table_oids = list_copy_head(table_oids,
> list_length(table_oids) - rand);
> +                       table_oids = list_concat(table_oids, tmp_oids);
> +               }
> +       }
>         /*
>          * Perform operations on collected tables.
>          */
>
>
> [1] How Autovacuum Goes Wrong: And Can We Please Make It Stop Doing
> That? https://www.youtube.com/watch?v=RfTD-Twpvac
>
>
> --
> Regards
> Junwang Zhao
>
>
>

Reply via email to