Re: Read-Write optimistic lock (Re: sinvaladt.c: remove msgnumLock, use atomic operations on maxMsgNum)
Yura Sokolov <y.sokolov@postgrespro.ru>
From: Yura Sokolov <y.sokolov@postgrespro.ru>
To: Andres Freund <andres@anarazel.de>
Cc: Heikki Linnakangas <hlinnaka@iki.fi>,
"pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>
Date: 2025-06-16T14:28:31Z
Lists: pgsql-hackers
Attachments
- v5-0001-Read-Write-optimistic-spin-lock.patch (text/x-patch) patch v5-0001
04.06.2025 00:04, Andres Freund пишет: > Hi, > > On 2025-06-02 21:20:33 +0300, Yura Sokolov wrote: >> But still problem of spin lock contention is here. > > I still would like to see a reproducer for this. For problem in sinvaladt.c we have no synthetic reproducer. But version with changed maxMsgNum to atomic solved customer's issue. For problem on XLogRecoveryCtlData->info_lck we have reproducer which shows follower with a lot of logical walsenders with patched version lags less and uses less CPU... but only 4-socket Xeon(R) Gold 6348H. There is no benefit from patch on 2-socket Intel(R) Xeon(R) Gold 5220R. >> So I propose to introduce another spin lock type capable for Exclusive and >> Shared lock modes (i.e. Write/Read modes) and use it in this two places. > > I am vehemently opposed to that. We should work towards getting rid of > spinlocks, not introduce more versions of spinlocks. Userspace spinlocks > largely are a bad idea. We should instead make properly queued locks cheaper > (e.g. by having an exclusive-only lock, which can be cheaper to release on > common platforms). 1. when faster lock will arrive? 2. "exclusive-only" lock will never scale at scenario when there are few writers and a lot of readers. It is just direct consequence of Amdahl's Law. To be honestly, our version of XLogRecoveryCtlData->info_lck fix is based on optimistic read-write lock. I've tried to make more regular read-write spin lock in previous patch version to make it more familiar. But after playing a bit with variants using simple C program [1], I found optimistic lock is only really scalable solution for the problem (aside of direct use of atomic operations). So attached version contains optimistic read-write lock used in these two places. [1] https://pastebin.com/CwSPkeGi -- regards Yura Sokolov aka funny-falcon
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Use replay LSN as target for cascading logical WAL senders
- 5231ed8262c9 18.0 cited
-
doc PG 18 relnotes: adjust COPY and REJECT_LIMIT items
- b3754dcc9ff7 18.0 cited