mirror of
https://github.com/postgres/postgres.git
synced 2025-07-24 14:22:24 +03:00
Make commit_delay much smarter.
Instead of letting every backend participating in a group commit wait independently, have the first one that becomes ready to flush WAL wait for the configured delay, and let all the others wait just long enough for that first process to complete its flush. This greatly increases the chances of being able to configure a commit_delay setting that actually improves performance. As a side consequence of this change, commit_delay now affects all WAL flushes, rather than just commits. There was some discussion on pgsql-hackers about whether to rename the GUC to, say, wal_flush_delay, but in the absence of consensus I am leaving it alone for now. Peter Geoghegan, with some changes, mostly to the documentation, by me.
This commit is contained in:
@ -68,9 +68,6 @@ bool XactDeferrable;
|
||||
|
||||
int synchronous_commit = SYNCHRONOUS_COMMIT_ON;
|
||||
|
||||
int CommitDelay = 0; /* precommit delay in microseconds */
|
||||
int CommitSiblings = 5; /* # concurrent xacts needed to sleep */
|
||||
|
||||
/*
|
||||
* MyXactAccessedTempRel is set when a temporary relation is accessed.
|
||||
* We don't allow PREPARE TRANSACTION in that case. (This is global
|
||||
@ -1123,22 +1120,6 @@ RecordTransactionCommit(void)
|
||||
if ((wrote_xlog && synchronous_commit > SYNCHRONOUS_COMMIT_OFF) ||
|
||||
forceSyncCommit || nrels > 0)
|
||||
{
|
||||
/*
|
||||
* Synchronous commit case:
|
||||
*
|
||||
* Sleep before flush! So we can flush more than one commit records
|
||||
* per single fsync. (The idea is some other backend may do the
|
||||
* XLogFlush while we're sleeping. This needs work still, because on
|
||||
* most Unixen, the minimum select() delay is 10msec or more, which is
|
||||
* way too long.)
|
||||
*
|
||||
* We do not sleep if enableFsync is not turned on, nor if there are
|
||||
* fewer than CommitSiblings other backends with active transactions.
|
||||
*/
|
||||
if (CommitDelay > 0 && enableFsync &&
|
||||
MinimumActiveBackends(CommitSiblings))
|
||||
pg_usleep(CommitDelay);
|
||||
|
||||
XLogFlush(XactLastRecEnd);
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user