Re: PGPROC alignment (was Re: pgsql: Separate RecoveryConflictReasons from procsignals)
Heikki Linnakangas <hlinnaka@iki.fi>
From: Heikki Linnakangas <hlinnaka@iki.fi>
To: Andres Freund <andres@anarazel.de>,
Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2026-02-10T20:53:58Z
Lists: pgsql-hackers
Attachments
- v2-0001-Align-PGPROC-to-cache-line-boundary.patch (text/x-patch) patch v2-0001
- v2-0002-Remove-useless-store.patch (text/x-patch) patch v2-0002
- v2-0003-Split-PGPROC-links-field-into-two-for-clarity.patch (text/x-patch) patch v2-0003
- v2-0004-Rearrange-fields-in-PGPROC-for-clarity.patch (text/x-patch) patch v2-0004
On 10/02/2026 21:46, Andres Freund wrote: > On 2026-02-10 19:15:27 +0000, Bertrand Drouvot wrote: >> On Tue, Feb 10, 2026 at 01:15:01PM -0500, Andres Freund wrote: >>> On 2026-02-10 19:14:44 +0200, Heikki Linnakangas wrote: >>> Yea, I don't think we need to be perfect here. Just a bit less bad. And, as >>> you say, the current order doesn't make a lot of sense. >>> Just grouping things like >>> - pid, pgxactoff, backendType (i.e. barely if ever changing) >>> - wait_event_info, waitStart (i.e. very frequently changing, but typically >>> accessed within one proc) >>> - sem, lwWaiting, waitLockMode (i.e. stuff that is updated frequently and >>> accessed across processes) >> >> With an ordering like in the attached (to apply on top of Heikki's patch), we're >> back to 832 bytes. > > You'd really need to insert padding between the sections to make it work... Here's my attempt at grouping things more logically. I didn't insert padding and also didn't try to avoid alignment padding. I tried to optimize for readability rather than size or performance. That said, I would assume that grouping things logically like this would also help to avoid false sharing. If not, inserting explicit padding seems like a a good fix. I also think we should split 'links' into two fields. For clarity. With this, sizeof(PGPROC) == 864 without the explicit alignment to PG_CACHE_LINE_SIZE, and 896 with it. - Heikki
Commits
-
Use C11 alignas in typedef definitions
- 5c2a8d272b9a 19 (unreleased) landed
-
Align PGPROC to cache line boundary
- 412f78c66eed 19 (unreleased) landed
-
Rearrange fields in PGPROC, for clarity
- 2e0853176f8f 19 (unreleased) landed
-
Split PGPROC 'links' field into two, for clarity
- 36bbcd5be3ff 19 (unreleased) landed
-
Remove useless store to local variable
- ab32a9e21d37 19 (unreleased) landed
-
Separate RecoveryConflictReasons from procsignals
- 17f51ea81875 19 (unreleased) cited