mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Checkpoint sorting and balancing.
Up to now checkpoints were written in the order they're in the BufferDescriptors. That's nearly random in a lot of cases, which performs badly on rotating media, but even on SSDs it causes slowdowns. To avoid that, sort checkpoints before writing them out. We currently sort by tablespace, relfilenode, fork and block number. One of the major reasons that previously wasn't done, was fear of imbalance between tablespaces. To address that balance writes between tablespaces. The other prime concern was that the relatively large allocation to sort the buffers in might fail, preventing checkpoints from happening. Thus pre-allocate the required memory in shared memory, at server startup. This particularly makes it more efficient to have checkpoint flushing enabled, because that'll often result in a lot of writes that can be coalesced into one flush. Discussion: alpine.DEB.2.10.1506011320000.28433@sto Author: Fabien Coelho and Andres Freund
This commit is contained in:
@@ -239,6 +239,24 @@ extern PGDLLIMPORT WritebackContext BackendWritebackContext;
|
||||
/* in localbuf.c */
|
||||
extern BufferDesc *LocalBufferDescriptors;
|
||||
|
||||
/* in bufmgr.c */
|
||||
|
||||
/*
|
||||
* Structure to sort buffers per file on checkpoints.
|
||||
*
|
||||
* This structure is allocated per buffer in shared memory, so it should be
|
||||
* kept as small as possible.
|
||||
*/
|
||||
typedef struct CkptSortItem
|
||||
{
|
||||
Oid tsId;
|
||||
Oid relNode;
|
||||
ForkNumber forkNum;
|
||||
BlockNumber blockNum;
|
||||
int buf_id;
|
||||
} CkptSortItem;
|
||||
|
||||
extern CkptSortItem *CkptBufferIds;
|
||||
|
||||
/*
|
||||
* Internal buffer management routines
|
||||
|
||||
Reference in New Issue
Block a user