Re: Adding basic NUMA awareness
Tomas Vondra <tomas@vondra.me>
From: Tomas Vondra <tomas@vondra.me>
To: Andres Freund <andres@anarazel.de>
Cc: Jakub Wartak <jakub.wartak@enterprisedb.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2025-09-18T21:04:45Z
Lists: pgsql-hackers
Attachments
- v20250918-0001-NUMA-shared-buffers-partitioning.patch (text/x-patch) patch v20250918-0001
- v20250918-0002-NUMA-clockweep-partitioning.patch (text/x-patch) patch v20250918-0002
- v20250918-0003-NUMA-clocksweep-allocation-balancing.patch (text/x-patch) patch v20250918-0003
- v20250918-0004-NUMA-weighted-clocksweep-balancing.patch (text/x-patch) patch v20250918-0004
- v20250918-0005-NUMA-partition-PGPROC.patch (text/x-patch) patch v20250918-0005
- v20250918-0006-fixup-StrategyGetBuffer.patch (text/x-patch) patch v20250918-0006
On 9/11/25 10:32, Tomas Vondra wrote: > ... > > 8) I've realized some of the TAP tests occasionally fail with > > ERROR: no unpinned buffers > > and I think I know why. Some of the tests set shared_buffers to a very > low value - like 1MB or even 128kB, and StrategyGetBuffer() may search > only a single partition (but not always). We may run out of unpinned > buffers in that one partition. > > This apparently happens more easily on rpi5, due to the weird NUMA > layout (there are 8 nodes with memory, but getcpu() reports node 0 for > all cores). > > I suspect the correct fix is to ensure StrategyGetBuffer() scans all > partitions, if there are no unpinned buffers in the current one. On > realistic setups this shouldn't happen very often, I think. > > The other issue I just realized is that StrategyGetBuffer() recalculates > the partition index over and over, which seems unnecessary (and possibly > expensive, due to the modulo). And it also does too many loops, because > it used NBuffers instead of the partition size. I'll fix those later. Here's a version fixing this issue (in the 0006 part). It modifies StrategyGetBuffer() to walk through all the partitions, in a round-robin manner. The way it steps to the next partition is a bit ugly, but it works and I'll think about some better way. I haven't done anything about the other issue (the one with huge pages reserved on NUMA nodes, and SIGBUS). regards -- Tomas Vondra
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Sort guc_parameters.dat alphabetically by name
- fce7c73fba4e 19 (unreleased) cited