mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +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:
@ -42,6 +42,7 @@
|
||||
#include "pg_trace.h"
|
||||
#include "pgstat.h"
|
||||
#include "storage/proc.h"
|
||||
#include "storage/sync.h"
|
||||
|
||||
/*
|
||||
* Defines for CLOG page sizes. A page is the same BLCKSZ as is used
|
||||
@ -691,7 +692,8 @@ CLOGShmemInit(void)
|
||||
{
|
||||
XactCtl->PagePrecedes = CLOGPagePrecedes;
|
||||
SimpleLruInit(XactCtl, "Xact", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE,
|
||||
XactSLRULock, "pg_xact", LWTRANCHE_XACT_BUFFER);
|
||||
XactSLRULock, "pg_xact", LWTRANCHE_XACT_BUFFER,
|
||||
SYNC_HANDLER_CLOG);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -808,34 +810,19 @@ TrimCLOG(void)
|
||||
LWLockRelease(XactSLRULock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This must be called ONCE during postmaster or standalone-backend shutdown
|
||||
*/
|
||||
void
|
||||
ShutdownCLOG(void)
|
||||
{
|
||||
/* Flush dirty CLOG pages to disk */
|
||||
TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(false);
|
||||
SimpleLruFlush(XactCtl, false);
|
||||
|
||||
/*
|
||||
* fsync pg_xact to ensure that any files flushed previously are durably
|
||||
* on disk.
|
||||
*/
|
||||
fsync_fname("pg_xact", true);
|
||||
|
||||
TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a checkpoint --- either during shutdown, or on-the-fly
|
||||
*/
|
||||
void
|
||||
CheckPointCLOG(void)
|
||||
{
|
||||
/* Flush dirty CLOG pages to disk */
|
||||
/*
|
||||
* Write dirty CLOG pages to disk. This may result in sync requests
|
||||
* queued for later handling by ProcessSyncRequests(), as part of the
|
||||
* checkpoint.
|
||||
*/
|
||||
TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true);
|
||||
SimpleLruFlush(XactCtl, true);
|
||||
SimpleLruWriteAll(XactCtl, true);
|
||||
TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(true);
|
||||
}
|
||||
|
||||
@ -1026,3 +1013,12 @@ clog_redo(XLogReaderState *record)
|
||||
else
|
||||
elog(PANIC, "clog_redo: unknown op code %u", info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Entrypoint for sync.c to sync clog files.
|
||||
*/
|
||||
int
|
||||
clogsyncfiletag(const FileTag *ftag, char *path)
|
||||
{
|
||||
return SlruSyncFileTag(XactCtl, ftag, path);
|
||||
}
|
||||
|
Reference in New Issue
Block a user