mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Improve heuristics for compressing the KnownAssignedXids array.
Previously, we'd compress only when the active range of array entries reached Max(4 * PROCARRAY_MAXPROCS, 2 * pArray->numKnownAssignedXids). If max_connections is large, the first term could result in not compressing for a long time, resulting in much wastage of cycles in hot-standby backends scanning the array to take snapshots. Get rid of that term, and just bound it to 2 * pArray->numKnownAssignedXids. That however creates the opposite risk, that we might spend too much effort compressing. Hence, consider compressing only once every 128 commit records. (This frequency was chosen by benchmarking. While we only tried one benchmark scenario, the results seem stable over a fairly wide range of frequencies.) Also, force compression when processing RecoveryInfo WAL records (which should be infrequent); the old code could perform compression then, but would do so only after the same array-range check as for the transaction-commit path. Also, opportunistically run compression if the startup process is about to wait for WAL, though not oftener than once a second. This should prevent cases where we waste lots of time by leaving the array not-compressed for long intervals due to low WAL traffic. Lastly, add a simple check to keep us from uselessly compressing when the array storage is already compact. Back-patch, as the performance problem is worse in pre-v14 branches than in HEAD. Simon Riggs and Michail Nikolaev, with help from Tom Lane and Andres Freund. Discussion: https://postgr.es/m/CALdSSPgahNUD_=pB_j=1zSnDBaiOtqVfzo8Ejt5J_k7qZiU1Tw@mail.gmail.com
This commit is contained in:
@ -12514,6 +12514,9 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
|
||||
wait_time = wal_retrieve_retry_interval -
|
||||
TimestampDifferenceMilliseconds(last_fail_time, now);
|
||||
|
||||
/* Do background tasks that might benefit us later. */
|
||||
KnownAssignedTransactionIdsIdleMaintenance();
|
||||
|
||||
(void) WaitLatch(&XLogCtl->recoveryWakeupLatch,
|
||||
WL_LATCH_SET | WL_TIMEOUT |
|
||||
WL_EXIT_ON_PM_DEATH,
|
||||
@ -12776,6 +12779,9 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
|
||||
streaming_reply_sent = true;
|
||||
}
|
||||
|
||||
/* Do any background tasks that might benefit us later. */
|
||||
KnownAssignedTransactionIdsIdleMaintenance();
|
||||
|
||||
/*
|
||||
* Wait for more WAL to arrive. Time out after 5 seconds
|
||||
* to react to a trigger file promptly and to check if the
|
||||
|
Reference in New Issue
Block a user