mirror of
https://github.com/postgres/postgres.git
synced 2025-10-27 00:12:01 +03:00
Defer flushing of SLRU files.
Previously, we called fsync() after writing out individual pg_xact,
pg_multixact and pg_commit_ts pages due to cache pressure, leading to
regular I/O stalls in user backends and recovery. Collapse requests for
the same file into a single system call as part of the next checkpoint,
as we already did for relation files, using the infrastructure developed
by commit 3eb77eba. This can cause a significant improvement to
recovery performance, especially when it's otherwise CPU-bound.
Hoist ProcessSyncRequests() up into CheckPointGuts() to make it clearer
that it applies to all the SLRU mini-buffer-pools as well as the main
buffer pool. Rearrange things so that data collected in CheckpointStats
includes SLRU activity.
Also remove the Shutdown{CLOG,CommitTS,SUBTRANS,MultiXact}() functions,
because they were redundant after the shutdown checkpoint that
immediately precedes them. (I'm not sure if they were ever needed, but
they aren't now.)
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> (parts)
Tested-by: Jakub Wartak <Jakub.Wartak@tomtom.com>
Discussion: https://postgr.es/m/CA+hUKGLJ=84YT+NvhkEEDAuUtVHMfQ9i-N7k_o50JmQ6Rpj_OQ@mail.gmail.com
This commit is contained in:
@@ -18,6 +18,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
#include "access/commit_ts.h"
|
||||
#include "access/clog.h"
|
||||
#include "access/multixact.h"
|
||||
#include "access/xlog.h"
|
||||
#include "access/xlogutils.h"
|
||||
#include "commands/tablespace.h"
|
||||
@@ -90,12 +93,31 @@ typedef struct SyncOps
|
||||
const FileTag *candidate);
|
||||
} SyncOps;
|
||||
|
||||
/*
|
||||
* These indexes must correspond to the values of the SyncRequestHandler enum.
|
||||
*/
|
||||
static const SyncOps syncsw[] = {
|
||||
/* magnetic disk */
|
||||
{
|
||||
[SYNC_HANDLER_MD] = {
|
||||
.sync_syncfiletag = mdsyncfiletag,
|
||||
.sync_unlinkfiletag = mdunlinkfiletag,
|
||||
.sync_filetagmatches = mdfiletagmatches
|
||||
},
|
||||
/* pg_xact */
|
||||
[SYNC_HANDLER_CLOG] = {
|
||||
.sync_syncfiletag = clogsyncfiletag
|
||||
},
|
||||
/* pg_commit_ts */
|
||||
[SYNC_HANDLER_COMMIT_TS] = {
|
||||
.sync_syncfiletag = committssyncfiletag
|
||||
},
|
||||
/* pg_multixact/offsets */
|
||||
[SYNC_HANDLER_MULTIXACT_OFFSET] = {
|
||||
.sync_syncfiletag = multixactoffsetssyncfiletag
|
||||
},
|
||||
/* pg_multixact/members */
|
||||
[SYNC_HANDLER_MULTIXACT_MEMBER] = {
|
||||
.sync_syncfiletag = multixactmemberssyncfiletag
|
||||
}
|
||||
};
|
||||
|
||||
@@ -505,8 +527,8 @@ RememberSyncRequest(const FileTag *ftag, SyncRequestType type)
|
||||
(void *) ftag,
|
||||
HASH_ENTER,
|
||||
&found);
|
||||
/* if new entry, initialize it */
|
||||
if (!found)
|
||||
/* if new entry, or was previously canceled, initialize it */
|
||||
if (!found || entry->canceled)
|
||||
{
|
||||
entry->cycle_ctr = sync_cycle_ctr;
|
||||
entry->canceled = false;
|
||||
|
||||
Reference in New Issue
Block a user