mirror of
https://github.com/postgres/postgres.git
synced 2025-10-22 14:32:25 +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:
@@ -12,6 +12,7 @@
|
||||
#define CLOG_H
|
||||
|
||||
#include "access/xlogreader.h"
|
||||
#include "storage/sync.h"
|
||||
#include "lib/stringinfo.h"
|
||||
|
||||
/*
|
||||
@@ -50,6 +51,8 @@ extern void CheckPointCLOG(void);
|
||||
extern void ExtendCLOG(TransactionId newestXact);
|
||||
extern void TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid);
|
||||
|
||||
extern int clogsyncfiletag(const FileTag *ftag, char *path);
|
||||
|
||||
/* XLOG stuff */
|
||||
#define CLOG_ZEROPAGE 0x00
|
||||
#define CLOG_TRUNCATE 0x10
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include "access/xlog.h"
|
||||
#include "datatype/timestamp.h"
|
||||
#include "replication/origin.h"
|
||||
#include "storage/sync.h"
|
||||
#include "utils/guc.h"
|
||||
|
||||
|
||||
@@ -45,6 +46,8 @@ extern void SetCommitTsLimit(TransactionId oldestXact,
|
||||
TransactionId newestXact);
|
||||
extern void AdvanceOldestCommitTsXid(TransactionId oldestXact);
|
||||
|
||||
extern int committssyncfiletag(const FileTag *ftag, char *path);
|
||||
|
||||
/* XLOG stuff */
|
||||
#define COMMIT_TS_ZEROPAGE 0x00
|
||||
#define COMMIT_TS_TRUNCATE 0x10
|
||||
|
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "access/xlogreader.h"
|
||||
#include "lib/stringinfo.h"
|
||||
#include "storage/sync.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -116,6 +117,9 @@ extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
|
||||
extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
|
||||
MultiXactId multi2);
|
||||
|
||||
extern int multixactoffsetssyncfiletag(const FileTag *ftag, char *path);
|
||||
extern int multixactmemberssyncfiletag(const FileTag *ftag, char *path);
|
||||
|
||||
extern void AtEOXact_MultiXact(void);
|
||||
extern void AtPrepare_MultiXact(void);
|
||||
extern void PostPrepare_MultiXact(TransactionId xid);
|
||||
|
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "access/xlogdefs.h"
|
||||
#include "storage/lwlock.h"
|
||||
#include "storage/sync.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -111,10 +112,10 @@ typedef struct SlruCtlData
|
||||
SlruShared shared;
|
||||
|
||||
/*
|
||||
* This flag tells whether to fsync writes (true for pg_xact and multixact
|
||||
* stuff, false for pg_subtrans and pg_notify).
|
||||
* Which sync handler function to use when handing sync requests over to
|
||||
* the checkpointer. SYNC_HANDLER_NONE to disable fsync (eg pg_notify).
|
||||
*/
|
||||
bool do_fsync;
|
||||
SyncRequestHandler sync_handler;
|
||||
|
||||
/*
|
||||
* Decide which of two page numbers is "older" for truncation purposes. We
|
||||
@@ -135,14 +136,15 @@ typedef SlruCtlData *SlruCtl;
|
||||
|
||||
extern Size SimpleLruShmemSize(int nslots, int nlsns);
|
||||
extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
|
||||
LWLock *ctllock, const char *subdir, int tranche_id);
|
||||
LWLock *ctllock, const char *subdir, int tranche_id,
|
||||
SyncRequestHandler sync_handler);
|
||||
extern int SimpleLruZeroPage(SlruCtl ctl, int pageno);
|
||||
extern int SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok,
|
||||
TransactionId xid);
|
||||
extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno,
|
||||
TransactionId xid);
|
||||
extern void SimpleLruWritePage(SlruCtl ctl, int slotno);
|
||||
extern void SimpleLruFlush(SlruCtl ctl, bool allow_redirtied);
|
||||
extern void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied);
|
||||
extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage);
|
||||
extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno);
|
||||
|
||||
@@ -151,6 +153,8 @@ typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int segpage,
|
||||
extern bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data);
|
||||
extern void SlruDeleteSegment(SlruCtl ctl, int segno);
|
||||
|
||||
extern int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path);
|
||||
|
||||
/* SlruScanDirectory public callbacks */
|
||||
extern bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename,
|
||||
int segpage, void *data);
|
||||
|
Reference in New Issue
Block a user