Re: SLRU optimization - configurable buffer pool and partitioning the SLRU lock
Dilip Kumar <dilipbalaut@gmail.com>
From: Dilip Kumar <dilipbalaut@gmail.com>
To: "Andrey M. Borodin" <x4mmm@yandex-team.ru>
Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-11-08T11:40:43Z
Lists: pgsql-hackers
Attachments
- v5-0002-Divide-SLRU-buffers-into-banks.patch (application/octet-stream) patch v5-0002
- v5-0003-Remove-the-centralized-control-lock-and-LRU-count.patch (application/octet-stream) patch v5-0003
- v5-0001-Make-all-SLRU-buffer-sizes-configurable.patch (application/octet-stream) patch v5-0001
On Mon, Nov 6, 2023 at 9:39 AM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > On Sun, Nov 5, 2023 at 1:37 AM Andrey M. Borodin <x4mmm@yandex-team.ru> wrote: > > > Maybe we could decouple locks and counters from SLRU banks? Banks were meant to be small to exploit performance of local linear search. Lock partitions have to be bigger for sure. > > Yeah, that could also be an idea if we plan to drop the hash. I mean > bank-wise counter is fine as we are finding a victim buffer within a > bank itself, but each lock could cover more slots than one bank size > or in other words, it can protect multiple banks. Let's hear more > opinion on this. Here is the updated version of the patch, here I have taken the approach suggested by Andrey and I discussed the same with Alvaro offlist and he also agrees with it. So the idea is that we will keep the bank size fixed which is 16 buffers per bank and the allowed GUC value for each slru buffer must be in multiple of the bank size. We have removed the centralized lock but instead of one lock per bank, we have kept the maximum limit on the number of bank locks which is 128. We kept the max limit as 128 because, in one of the operations (i.e. ActivateCommitTs), we need to acquire all the bank locks (but this is not a performance path at all) and at a time we can acquire a max of 200 LWlocks, so we think this limit of 128 is good. So now if the number of banks is <= 128 then we will be using one lock per bank otherwise the one lock may protect access of buffer in multiple banks. We might argue that we should keep the max lock lesser than 128 i.e. 64 or 32 and I am open to that we can do more experiments with a very large buffer pool and a very heavy workload to see whether having lock up to 128 is helpful or not -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com
Commits
-
Fix zeroing of pg_serial page without SLRU bank lock
- be2f07310063 17.0 landed
-
Fix misspelled assertions
- 0d3a71d0c8a7 17.0 landed
-
GUC table: Add description to computed variables
- 30b8d6e4ce11 17.0 landed
-
Improve performance of subsystems on top of SLRU
- 53c2a97a9266 17.0 landed
-
Rename SLRU elements in view pg_stat_slru
- bcdfa5f2e2f2 17.0 landed
-
Use atomic access for SlruShared->latest_page_number
- d172b717c6f4 17.0 landed
-
Split use of SerialSLRULock, creating SerialControlLock
- 7b745d85b80d 17.0 landed
-
Index SLRUs by 64-bit integers rather than by 32-bit integers
- 4ed8f0913bfd 17.0 cited
-
Add a macro templatized hashtable.
- b30d3ea824c5 10.0 cited