Re: elog(DEBUG2 in SpinLocked section.
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Robert Haas <robertmhaas@gmail.com>, Michael Paquier <michael@paquier.xyz>, Kyotaro Horiguchi <horikyota.ntt@gmail.com>, Fujii Masao <masao.fujii@oss.nttdata.com>, Amit Kapila <amit.kapila16@gmail.com>, pasim@vmware.com, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2020-06-09T23:54:15Z
Lists: pgsql-hackers
Hi, On 2020-06-09 19:24:15 -0400, Tom Lane wrote: > Robert Haas <robertmhaas@gmail.com> writes: > > On Tue, Jun 9, 2020 at 1:59 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > >> When I went through the existing spinlock stanzas, the only thing that > >> really made me acutely uncomfortable was the chunk in pg_stat_statement's > >> pgss_store(), lines 1386..1438 in HEAD. > > > I mean, what would be wrong with having an LWLock per pgss entry? +1 > Hmm, maybe nothing. I'm accustomed to thinking of them as being > significantly more expensive than spinlocks, but maybe we've narrowed > the gap enough that that's not such a problem. They do add a few cycles (IIRC ~30 or so, last time I measured a specific scenario) of latency to acquisition, but it's not a large amount. The only case where acquisition is noticably slower, in my experiments, is when there's "just the right amount" of contention. There spinning instead of entering the kernel can be good. I've mused about adding a small amount of spinning to lwlock acquisition before. But so far working on reducing contention seemed the better route. Funnily enough lwlock *release*, even when there are no waiters, has a somewhat noticable performance difference on x86 (and other TSO platforms) compared to spinlock release. For spinlock release we can just use a plain write and a compiler barrier, whereas lwlock release needs to use an atomic operation. I think that's hard, but not impossible, to avoid for an userspace reader-writer lock. It would be a nice experiment to make spinlocks a legacy wrapper around rwlocks. I think if we added 2-3 optimizations (optimize for exclusive-only locks, short amount of spinning, possibly inline functions for "fast path" acquisitions/release) that'd be better for nearly all situations. And in the situations where it's not, the loss would be pretty darn small. Greetings, Andres Freund
Commits
-
Fix instance of elog() called while holding a spinlock
- 4a9809e34d09 9.5.23 landed
- e7a134b5817b 9.6.19 landed
- 5ed8b4a981ed 10.14 landed
- b41a85f53317 11.9 landed
- 03aa25b6e34b 12.4 landed
- c1669fd5812a 13.0 landed
-
Don't call palloc() while holding a spinlock, either.
- 3d474a07934c 12.4 landed
- f88bd3139f3e 13.0 landed
- 7a8cb4a61e7e 11.9 landed
- 0c735c686a90 10.14 landed
-
Don't call elog() while holding spinlock.
- caa3c4242cf8 13.0 landed