mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +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:
@ -8528,10 +8528,6 @@ ShutdownXLOG(int code, Datum arg)
|
||||
|
||||
CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
|
||||
}
|
||||
ShutdownCLOG();
|
||||
ShutdownCommitTs();
|
||||
ShutdownSUBTRANS();
|
||||
ShutdownMultiXact();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -9176,17 +9172,29 @@ CreateEndOfRecoveryRecord(void)
|
||||
static void
|
||||
CheckPointGuts(XLogRecPtr checkPointRedo, int flags)
|
||||
{
|
||||
CheckPointRelationMap();
|
||||
CheckPointReplicationSlots();
|
||||
CheckPointSnapBuild();
|
||||
CheckPointLogicalRewriteHeap();
|
||||
CheckPointReplicationOrigin();
|
||||
|
||||
/* Write out all dirty data in SLRUs and the main buffer pool */
|
||||
TRACE_POSTGRESQL_BUFFER_CHECKPOINT_START(flags);
|
||||
CheckpointStats.ckpt_write_t = GetCurrentTimestamp();
|
||||
CheckPointCLOG();
|
||||
CheckPointCommitTs();
|
||||
CheckPointSUBTRANS();
|
||||
CheckPointMultiXact();
|
||||
CheckPointPredicate();
|
||||
CheckPointRelationMap();
|
||||
CheckPointReplicationSlots();
|
||||
CheckPointSnapBuild();
|
||||
CheckPointLogicalRewriteHeap();
|
||||
CheckPointBuffers(flags); /* performs all required fsyncs */
|
||||
CheckPointReplicationOrigin();
|
||||
CheckPointBuffers(flags);
|
||||
|
||||
/* Perform all queued up fsyncs */
|
||||
TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START();
|
||||
CheckpointStats.ckpt_sync_t = GetCurrentTimestamp();
|
||||
ProcessSyncRequests();
|
||||
CheckpointStats.ckpt_sync_end_t = GetCurrentTimestamp();
|
||||
TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE();
|
||||
|
||||
/* We deliberately delay 2PC checkpointing as long as possible */
|
||||
CheckPointTwoPhase(checkPointRedo);
|
||||
}
|
||||
|
Reference in New Issue
Block a user