Skip to content

Commit 8693559

Browse files
New autovacuum_work_mem parameter
If autovacuum_work_mem is set, autovacuum workers now use this parameter in preference to maintenance_work_mem. Peter Geoghegan
1 parent 36da3cf commit 8693559

File tree

6 files changed

+69
-10
lines changed

6 files changed

+69
-10
lines changed

doc/src/sgml/config.sgml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,8 +1198,26 @@ include 'filename'
11981198
</para>
11991199
<para>
12001200
Note that when autovacuum runs, up to
1201-
<xref linkend="guc-autovacuum-max-workers"> times this memory may be
1202-
allocated, so be careful not to set the default value too high.
1201+
<xref linkend="guc-autovacuum-max-workers"> times this memory
1202+
may be allocated, so be careful not to set the default value
1203+
too high. It may be useful to control for this by separately
1204+
setting <xref linkend="guc-autovacuum-work-mem">.
1205+
</para>
1206+
</listitem>
1207+
</varlistentry>
1208+
1209+
<varlistentry id="guc-autovacuum-work-mem" xreflabel="autovacuum_work_mem">
1210+
<term><varname>autovacuum_work_mem</varname> (<type>integer</type>)</term>
1211+
<indexterm>
1212+
<primary><varname>autovacuum_work_mem</> configuration parameter</primary>
1213+
</indexterm>
1214+
<listitem>
1215+
<para>
1216+
Specifies the maximum amount of memory to be used by each
1217+
autovacuum worker process. It defaults to -1, indicating that
1218+
the value of <xref linkend="guc-maintenance-work-mem"> should
1219+
be used instead. The setting has no effect on the behavior of
1220+
<command>VACUUM</command> when run in other contexts.
12031221
</para>
12041222
</listitem>
12051223
</varlistentry>

src/backend/commands/vacuumlazy.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
* relations with finite memory space usage. To do that, we set upper bounds
1111
* on the number of tuples and pages we will keep track of at once.
1212
*
13-
* We are willing to use at most maintenance_work_mem memory space to keep
14-
* track of dead tuples. We initially allocate an array of TIDs of that size,
15-
* with an upper limit that depends on table size (this limit ensures we don't
16-
* allocate a huge area uselessly for vacuuming small tables). If the array
17-
* threatens to overflow, we suspend the heap scan phase and perform a pass of
18-
* index cleanup and page compaction, then resume the heap scan with an empty
19-
* TID array.
13+
* We are willing to use at most maintenance_work_mem (or perhaps
14+
* autovacuum_work_mem) memory space to keep track of dead tuples. We
15+
* initially allocate an array of TIDs of that size, with an upper limit that
16+
* depends on table size (this limit ensures we don't allocate a huge area
17+
* uselessly for vacuuming small tables). If the array threatens to overflow,
18+
* we suspend the heap scan phase and perform a pass of index cleanup and page
19+
* compaction, then resume the heap scan with an empty TID array.
2020
*
2121
* If we're processing a table with no indexes, we can just vacuum each page
2222
* as we go; there's no need to save up multiple tuples to minimize the number
@@ -1599,10 +1599,13 @@ static void
15991599
lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks)
16001600
{
16011601
long maxtuples;
1602+
int vac_work_mem = IsAutoVacuumWorkerProcess() &&
1603+
autovacuum_work_mem != -1 ?
1604+
autovacuum_work_mem : maintenance_work_mem;
16021605

16031606
if (vacrelstats->hasindex)
16041607
{
1605-
maxtuples = (maintenance_work_mem * 1024L) / sizeof(ItemPointerData);
1608+
maxtuples = (vac_work_mem * 1024L) / sizeof(ItemPointerData);
16061609
maxtuples = Min(maxtuples, INT_MAX);
16071610
maxtuples = Min(maxtuples, MaxAllocSize / sizeof(ItemPointerData));
16081611

src/backend/postmaster/autovacuum.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
*/
111111
bool autovacuum_start_daemon = false;
112112
int autovacuum_max_workers;
113+
int autovacuum_work_mem = -1;
113114
int autovacuum_naptime;
114115
int autovacuum_vac_thresh;
115116
double autovacuum_vac_scale;

src/backend/utils/misc/guc.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ static const char *show_tcp_keepalives_count(void);
194194
static bool check_maxconnections(int *newval, void **extra, GucSource source);
195195
static bool check_max_worker_processes(int *newval, void **extra, GucSource source);
196196
static bool check_autovacuum_max_workers(int *newval, void **extra, GucSource source);
197+
static bool check_autovacuum_work_mem(int *newval, void **extra, GucSource source);
197198
static bool check_effective_io_concurrency(int *newval, void **extra, GucSource source);
198199
static void assign_effective_io_concurrency(int newval, void *extra);
199200
static void assign_pgstat_temp_directory(const char *newval, void *extra);
@@ -2357,6 +2358,17 @@ static struct config_int ConfigureNamesInt[] =
23572358
check_autovacuum_max_workers, NULL, NULL
23582359
},
23592360

2361+
{
2362+
{"autovacuum_work_mem", PGC_SIGHUP, RESOURCES_MEM,
2363+
gettext_noop("Sets the maximum memory to be used by each autovacuum worker process."),
2364+
NULL,
2365+
GUC_UNIT_KB
2366+
},
2367+
&autovacuum_work_mem,
2368+
-1, -1, MAX_KILOBYTES,
2369+
check_autovacuum_work_mem, NULL, NULL
2370+
},
2371+
23602372
{
23612373
{"tcp_keepalives_idle", PGC_USERSET, CLIENT_CONN_OTHER,
23622374
gettext_noop("Time between issuing TCP keepalives."),
@@ -8777,6 +8789,29 @@ check_autovacuum_max_workers(int *newval, void **extra, GucSource source)
87778789
return true;
87788790
}
87798791

8792+
static bool
8793+
check_autovacuum_work_mem(int *newval, void **extra, GucSource source)
8794+
{
8795+
/*
8796+
* -1 indicates fallback.
8797+
*
8798+
* If we haven't yet changed the boot_val default of -1, just let it be.
8799+
* Autovacuum will look to maintenance_work_mem instead.
8800+
*/
8801+
if (*newval == -1)
8802+
return true;
8803+
8804+
/*
8805+
* We clamp manually-set values to at least 1MB. Since
8806+
* maintenance_work_mem is always set to at least this value, do the same
8807+
* here.
8808+
*/
8809+
if (*newval < 1024)
8810+
*newval = 1024;
8811+
8812+
return true;
8813+
}
8814+
87808815
static bool
87818816
check_max_worker_processes(int *newval, void **extra, GucSource source)
87828817
{

src/backend/utils/misc/postgresql.conf.sample

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
# actively intend to use prepared transactions.
125125
#work_mem = 1MB # min 64kB
126126
#maintenance_work_mem = 16MB # min 1MB
127+
#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem
127128
#max_stack_depth = 2MB # min 100kB
128129
#dynamic_shared_memory_type = posix # the default is the first option
129130
# supported by the operating system:

src/include/postmaster/autovacuum.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
/* GUC variables */
1919
extern bool autovacuum_start_daemon;
2020
extern int autovacuum_max_workers;
21+
extern int autovacuum_work_mem;
2122
extern int autovacuum_naptime;
2223
extern int autovacuum_vac_thresh;
2324
extern double autovacuum_vac_scale;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy