Re: MultiXact\SLRU buffers configuration
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Andrey Borodin <x4mmm@yandex-team.ru>
Cc: Gilles Darold <gilles@darold.net>,
Tomas Vondra <tomas.vondra@enterprisedb.com>, Tomas Vondra <tomas.vondra@2ndquadrant.com>,
Alexander Korotkov <aekorotkov@gmail.com>, Anastasia Lubennikova <a.lubennikova@postgrespro.ru>,
Daniel Gustafsson <daniel@yesql.se>, Kyotaro Horiguchi <horikyota.ntt@gmail.com>,
pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2021-04-08T00:30:41Z
Lists: pgsql-hackers
Attachments
- v16-0001-Add-a-buffer-mapping-table-for-SLRUs.patch (text/x-patch) patch v16-0001
- v16-0002-Make-all-SLRU-buffer-sizes-configurable.patch (text/x-patch) patch v16-0002
- v16-0003-Limit-SLRU-buffer-replacement-search.patch (text/x-patch) patch v16-0003
On Thu, Apr 8, 2021 at 12:13 AM Andrey Borodin <x4mmm@yandex-team.ru> wrote: > > 7 апр. 2021 г., в 14:44, Andrey Borodin <x4mmm@yandex-team.ru> написал(а): > > Maybe instead of fully associative cache with random replacement we could use 1-associative cache? > > i.e. each page can reside only in one spcific buffer slot. If there's something else - evict it. > > I think this would be as efficient as RR cache. And it's soooo fast. > > I thought a bit more and understood that RR is protected from two competing pages in working set, while 1-associative cache is not. So, discard that idea. It's an interesting idea. I know that at least one proprietary fork just puts the whole CLOG in memory for direct indexing, which is what we'd have here if we said "oh, your xact_buffers setting is so large I'm just going to use slotno = pageno & mask". Here's another approach that is a little less exciting than "tournament RR" (or whatever that should be called; I couldn't find an established name for it). This version is just our traditional linear search, except that it stops at 128, and remembers where to start from next time (like a sort of Fisher-Price GCLOCK hand). This feels more committable to me. You can argue that all buffers above 128 are bonus buffers that PostgreSQL 13 didn't have, so the fact that we can no longer find the globally least recently used page when you set xact_buffers > 128 doesn't seem too bad to me, as an incremental step (but to be clear, of course we can do better than this with more work in later releases).
Commits
-
Rework new SLRU test with injection points
- 94a3373ac5c3 18.0 landed
-
injection_point: Add injection_points.stats
- 2e35c67f9568 18.0 landed
-
injection_points: Add initialization of shmem state when loading module
- b2b023aa3706 18.0 landed
-
Add injection-point test for new multixact CV usage
- 768a9fd5535f 18.0 landed
-
Use conditional variable to wait for next MultiXact offset
- a0e0fb1ba56f 17.0 landed
-
Improve performance of subsystems on top of SLRU
- 53c2a97a9266 17.0 landed
-
Adjust VACUUM hastup LP_REDIRECT comments.
- 325bc54eed4e 16.0 cited
-
Test replay of regression tests, attempt II.
- f47ed79cc8a0 15.0 cited