1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-18 02:02:55 +03:00

Add log_autoanalyze_min_duration

The log output functionality of log_autovacuum_min_duration applies to
both VACUUM and ANALYZE, so it is not possible to separate the VACUUM
and ANALYZE log output thresholds. Logs are likely to be output only for
VACUUM and not for ANALYZE.

Therefore, we decided to separate the threshold for log output of VACUUM
by autovacuum (log_autovacuum_min_duration) and the threshold for log
output of ANALYZE by autovacuum (log_autoanalyze_min_duration).

Author: Shinya Kato <shinya11.kato@gmail.com>
Reviewed-by: Kasahara Tatsuhito <kasaharatt@oss.nttdata.com>
Discussion: https://www.postgresql.org/message-id/flat/CAOzEurQtfV4MxJiWT-XDnimEeZAY+rgzVSLe8YsyEKhZcajzSA@mail.gmail.com
This commit is contained in:
Peter Eisentraut
2025-10-15 14:31:12 +02:00
parent 12609fbacb
commit dd3ae37830
16 changed files with 122 additions and 31 deletions

View File

@@ -322,12 +322,21 @@ static relopt_int intRelOpts[] =
{
{
"log_autovacuum_min_duration",
"Sets the minimum execution time above which autovacuum actions will be logged",
"Sets the minimum execution time above which vacuum actions by autovacuum will be logged",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
ShareUpdateExclusiveLock
},
-1, -1, INT_MAX
},
{
{
"log_autoanalyze_min_duration",
"Sets the minimum execution time above which analyze actions by autovacuum will be logged",
RELOPT_KIND_HEAP,
ShareUpdateExclusiveLock
},
-1, -1, INT_MAX
},
{
{
"toast_tuple_target",
@@ -1895,7 +1904,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
{"autovacuum_multixact_freeze_table_age", RELOPT_TYPE_INT,
offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, multixact_freeze_table_age)},
{"log_autovacuum_min_duration", RELOPT_TYPE_INT,
offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, log_min_duration)},
offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, log_vacuum_min_duration)},
{"log_autoanalyze_min_duration", RELOPT_TYPE_INT,
offsetof(StdRdOptions, autovacuum) + offsetof(AutoVacOpts, log_analyze_min_duration)},
{"toast_tuple_target", RELOPT_TYPE_INT,
offsetof(StdRdOptions, toast_tuple_target)},
{"autovacuum_vacuum_cost_delay", RELOPT_TYPE_REAL,

View File

@@ -648,7 +648,7 @@ heap_vacuum_rel(Relation rel, const VacuumParams params,
verbose = (params.options & VACOPT_VERBOSE) != 0;
instrument = (verbose || (AmAutoVacuumWorkerProcess() &&
params.log_min_duration >= 0));
params.log_vacuum_min_duration >= 0));
if (instrument)
{
pg_rusage_init(&ru0);
@@ -959,9 +959,9 @@ heap_vacuum_rel(Relation rel, const VacuumParams params,
{
TimestampTz endtime = GetCurrentTimestamp();
if (verbose || params.log_min_duration == 0 ||
if (verbose || params.log_vacuum_min_duration == 0 ||
TimestampDifferenceExceeds(starttime, endtime,
params.log_min_duration))
params.log_vacuum_min_duration))
{
long secs_dur;
int usecs_dur;

View File

@@ -138,7 +138,7 @@ analyze_rel(Oid relid, RangeVar *relation,
* Make sure to generate only logs for ANALYZE in this case.
*/
onerel = vacuum_open_relation(relid, relation, params.options & ~(VACOPT_VACUUM),
params.log_min_duration >= 0,
params.log_analyze_min_duration >= 0,
ShareUpdateExclusiveLock);
/* leave if relation could not be opened or locked */
@@ -310,7 +310,7 @@ do_analyze_rel(Relation onerel, const VacuumParams params,
verbose = (params.options & VACOPT_VERBOSE) != 0;
instrument = (verbose || (AmAutoVacuumWorkerProcess() &&
params.log_min_duration >= 0));
params.log_analyze_min_duration >= 0));
if (inh)
ereport(elevel,
(errmsg("analyzing \"%s.%s\" inheritance tree",
@@ -735,9 +735,9 @@ do_analyze_rel(Relation onerel, const VacuumParams params,
{
TimestampTz endtime = GetCurrentTimestamp();
if (verbose || params.log_min_duration == 0 ||
if (verbose || params.log_analyze_min_duration == 0 ||
TimestampDifferenceExceeds(starttime, endtime,
params.log_min_duration))
params.log_analyze_min_duration))
{
long delay_in_ms;
WalUsage walusage;

View File

@@ -406,8 +406,12 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
/* user-invoked vacuum is never "for wraparound" */
params.is_wraparound = false;
/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
params.log_min_duration = -1;
/*
* user-invoked vacuum uses VACOPT_VERBOSE instead of
* log_vacuum_min_duration and log_analyze_min_duration
*/
params.log_vacuum_min_duration = -1;
params.log_analyze_min_duration = -1;
/*
* Later, in vacuum_rel(), we check if a reloption override was specified.
@@ -2063,7 +2067,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams params,
/* open the relation and get the appropriate lock on it */
rel = vacuum_open_relation(relid, relation, params.options,
params.log_min_duration >= 0, lmode);
params.log_vacuum_min_duration >= 0, lmode);
/* leave if relation could not be opened or locked */
if (!rel)

View File

@@ -133,6 +133,7 @@ double autovacuum_vac_cost_delay;
int autovacuum_vac_cost_limit;
int Log_autovacuum_min_duration = 600000;
int Log_autoanalyze_min_duration = 600000;
/* the minimum allowed time between two awakenings of the launcher */
#define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */
@@ -2814,7 +2815,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
int freeze_table_age;
int multixact_freeze_min_age;
int multixact_freeze_table_age;
int log_min_duration;
int log_vacuum_min_duration;
int log_analyze_min_duration;
/*
* Calculate the vacuum cost parameters and the freeze ages. If there
@@ -2824,10 +2826,15 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
*/
/* -1 in autovac setting means use log_autovacuum_min_duration */
log_min_duration = (avopts && avopts->log_min_duration >= 0)
? avopts->log_min_duration
log_vacuum_min_duration = (avopts && avopts->log_vacuum_min_duration >= 0)
? avopts->log_vacuum_min_duration
: Log_autovacuum_min_duration;
/* -1 in autovac setting means use log_autoanalyze_min_duration */
log_analyze_min_duration = (avopts && avopts->log_analyze_min_duration >= 0)
? avopts->log_analyze_min_duration
: Log_autoanalyze_min_duration;
/* these do not have autovacuum-specific settings */
freeze_min_age = (avopts && avopts->freeze_min_age >= 0)
? avopts->freeze_min_age
@@ -2877,7 +2884,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
tab->at_params.multixact_freeze_min_age = multixact_freeze_min_age;
tab->at_params.multixact_freeze_table_age = multixact_freeze_table_age;
tab->at_params.is_wraparound = wraparound;
tab->at_params.log_min_duration = log_min_duration;
tab->at_params.log_vacuum_min_duration = log_vacuum_min_duration;
tab->at_params.log_analyze_min_duration = log_analyze_min_duration;
tab->at_params.toast_parent = InvalidOid;
/*

View File

@@ -1771,8 +1771,8 @@
},
{ name => 'log_autovacuum_min_duration', type => 'int', context => 'PGC_SIGHUP', group => 'LOGGING_WHAT',
short_desc => 'Sets the minimum execution time above which autovacuum actions will be logged.',
long_desc => '-1 disables logging autovacuum actions. 0 means log all autovacuum actions.',
short_desc => 'Sets the minimum execution time above which vacuum actions by autovacuum will be logged.',
long_desc => '-1 disables logging vacuum actions by autovacuum. 0 means log all vacuum actions by autovacuum.',
flags => 'GUC_UNIT_MS',
variable => 'Log_autovacuum_min_duration',
boot_val => '600000',
@@ -1780,6 +1780,16 @@
max => 'INT_MAX',
},
{ name => 'log_autoanalyze_min_duration', type => 'int', context => 'PGC_SIGHUP', group => 'LOGGING_WHAT',
short_desc => 'Sets the minimum execution time above which analyze actions by autovacuum will be logged.',
long_desc => '-1 disables logging analyze actions by autovacuum. 0 means log all analyze actions by autovacuum.',
flags => 'GUC_UNIT_MS',
variable => 'Log_autoanalyze_min_duration',
boot_val => '600000',
min => '-1',
max => 'INT_MAX',
},
{ name => 'log_parameter_max_length', type => 'int', context => 'PGC_SUSET', group => 'LOGGING_WHAT',
short_desc => 'Sets the maximum length in bytes of data logged for bind parameter values when logging statements.',
long_desc => '-1 means log values in full.',

View File

@@ -588,7 +588,12 @@
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_autovacuum_min_duration = 10min # log autovacuum activity;
#log_autovacuum_min_duration = 10min # log vacuum activity by autovacuum;
# -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number
# of milliseconds.
#log_autoanalyze_min_duration = 10min # log analyze activity by autovacuum;
# -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number