v1-0002-Optimize-memory-access-in-GetRunningTransactionDa.patch
application/octet-stream
Filename: v1-0002-Optimize-memory-access-in-GetRunningTransactionDa.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0002
Subject: Optimize memory access in GetRunningTransactionData()
| File | + | − |
|---|---|---|
| src/backend/storage/ipc/procarray.c | 11 | 6 |
From 622361df39c04f1efd8c9febeb559c952ba843fb Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Wed, 3 Jul 2024 00:21:13 +0300
Subject: [PATCH v1 2/2] Optimize memory access in GetRunningTransactionData()
e85662df44 made GetRunningTransactionData() calculate the oldest running
transaction id within the current database. This commit optimized this
calculation by performing a cheap transaction id comparison before fetching
the process database id, while the latter could cause extra cache misses.
Reported-by: Noah Misch
Discussion: https://postgr.es/m/20240630231816.bf.nmisch%40google.com
---
src/backend/storage/ipc/procarray.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 9fc930e98f8..16b5803d388 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -2753,8 +2753,6 @@ GetRunningTransactionData(void)
*/
for (index = 0; index < arrayP->numProcs; index++)
{
- int pgprocno = arrayP->pgprocnos[index];
- PGPROC *proc = &allProcs[pgprocno];
TransactionId xid;
/* Fetch xid just once - see GetNewTransactionId */
@@ -2776,11 +2774,18 @@ GetRunningTransactionData(void)
oldestRunningXid = xid;
/*
- * Also, update the oldest running xid within the current database.
+ * Also, update the oldest running xid within the current database. As
+ * fetching pgprocno and PGPROC could cause cache misses, we do cheap
+ * TransactionId comparison first.
*/
- if (proc->databaseId == MyDatabaseId &&
- TransactionIdPrecedes(xid, oldestDatabaseRunningXid))
- oldestDatabaseRunningXid = xid;
+ if (TransactionIdPrecedes(xid, oldestDatabaseRunningXid))
+ {
+ int pgprocno = arrayP->pgprocnos[index];
+ PGPROC *proc = &allProcs[pgprocno];
+
+ if (proc->databaseId == MyDatabaseId)
+ oldestDatabaseRunningXid = xid;
+ }
if (ProcGlobal->subxidStates[index].overflowed)
suboverflowed = true;
--
2.39.3 (Apple Git-145)