Re: remove adaptive spins_per_delay code

From: Andres Freund <andres(at)anarazel(dot)de>
To: Nathan Bossart <nathandbossart(at)gmail(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: remove adaptive spins_per_delay code
Date: 2024-08-27 18:27:00
Message-ID: w272rwzgxf3s7n7ufobhqf5uce2hq5zvhtn2ku4unyfau6qjm2@ds4n6lzgjvnm
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2024-08-27 11:16:15 -0500, Nathan Bossart wrote:
> (creating new thread from [0])
>
> On Wed, Apr 10, 2024 at 09:52:59PM -0400, Tom Lane wrote:
> > On fourth thought ... the number of tries to acquire the lock, or
> > in this case number of tries to observe the lock free, is not
> > NUM_DELAYS but NUM_DELAYS * spins_per_delay. Decreasing
> > spins_per_delay should therefore increase the risk of unexpected
> > "stuck spinlock" failures. And finish_spin_delay will decrement
> > spins_per_delay in any cycle where we slept at least once.
> > It's plausible therefore that this coding with finish_spin_delay
> > inside the main wait loop puts more downward pressure on
> > spins_per_delay than the algorithm is intended to cause.
> >
> > I kind of wonder whether the premises finish_spin_delay is written
> > on even apply anymore, given that nobody except some buildfarm
> > dinosaurs runs Postgres on single-processor hardware anymore.
> > Maybe we should rip out the whole mechanism and hard-wire
> > spins_per_delay at 1000 or so.
>
> I've been looking at spinlock contention on newer hardware, and while I do
> not yet have any proposal to share for that, I saw this adaptive
> spins_per_delay code and wondered about this possibility of "downward
> pressure on spins_per_delay" for contended locks. ISTM it could make
> matters worse in some cases.
>
> Anyway, I'm inclined to agree that the premise of the adaptive
> spins_per_delay code probably doesn't apply anymore, so here's a patch to
> remove it.

FWIW, I've seen cases on multi-socket machines where performance was vastly
worse under contention with some values of spins_per_delay. With good numbers
being quite different on smaller machines. Most new-ish server CPUs these days
basically behave like a multi-socket machine internally, due to being
internally partitioned into multiple chiplets. And it's pretty clear that that
trend isn't going to go away. So finding a good value probably isn't easy.

We don't have a whole lot of contended spin.h spinlocks left, except that we
have one very critical one, XLogCtl->Insert.insertpos_lck. And of course we
use the same spinning logic for buffer header locks - which can be heavily
contended.

I suspect that eventually we ought to replace all our userspace
spinlock-like-things with a framework for writing properly "waiting" locks
with some spinning. We can't just use lwlocks because support for
reader-writer locks makes them much more heavyweight (mainly because it
implies having to use an atomic operation for lock release, which shows up
substantially).

Greetings,

Andres Freund

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2024-08-27 18:40:06 Re: PoC: prefetching data between executor nodes (e.g. nestloop + indexscan)
Previous Message Tom Lane 2024-08-27 18:24:50 Re: allowing extensions to control planner behavior