Re: Restructured Shared Buffer Hash Table

From: Dhruv Aron <dhruv(dot)aron(at)gmail(dot)com>
To: Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
Cc: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, pgsql-hackers(at)postgresql(dot)org, haoyu(dot)huang(dot)68(at)gmail(dot)com
Subject: Re: Restructured Shared Buffer Hash Table
Date: 2026-07-10 18:53:06
Message-ID: CAAStW3LLnPYypEh3fQu+z-t1cAw7fUJh=0aQDZcMh=XOuJQF_Q@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, 7 Jul 2026 at 20:14, Heikki Linnakangas <hlinnaka(at)iki(dot)fi> wrote:
> Or maybe it's not a problem, in which case some kind of a
> worst case scenario benchmark to show that would be nice. Maybe test how
> it behaves when you have a lot of hash collisions, I think that'd make
> BufTableDelete() more expensive.

My additional benchmarking would suggest that, on average (one entry per
bucket), the spinlock would be held for an extra ~50ns compared to
releasing the header lock earlier for the current dynahash implementation:

Bucket Chain Length

Average Time Under Spinlock for Dynahash Implementation (ns)

Average Time Under Spinlock for New Table, Releasing Lock After Delete (ns)

1

64.4

112.9

2

63.4

118.6

4

63.1

122.3

8

68.8

139.8

16

76.0

159.1

32

77.7

195.0

64

102.0

248.6

On Tue, Jul 7, 2026 at 8:28 PM Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
wrote:
> If we are using a different data structure for buffer lookup,
> it will be good to consider ease of resizing as well.

Yes, we have internal functionality to resize (both shrink and expand) this
restructured table without rehashing the entire table, acquiring a global
lock, or introducing new synchronization primitives. Will create and share
a follow-up patch going into more detail soon.

Thanks,
Dhruv Aron

On Tue, Jul 7, 2026 at 8:28 PM Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
wrote:

> On Wed, Jul 8, 2026 at 12:44 AM Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
> wrote:
> >
> > On 07/07/2026 21:41, Dhruv Aron wrote:
> > > At Databricks, we’ve found that the existing dynahash table structure
> is
> > > leaving performance gains on the table when it comes to shared buffer
> > > lookups: the multi-level structure (directory, segment, bucket chain,
> > > freelist) appears excessive for the shared buffers and could be
> > > simplified to boost performance and lower memory overhead. As such, we
> > > are proposing a specialized hash table just for this purpose and would
> > > appreciate feedback on this approach.
> >
> > Yeah, the dynahash has features that we just don't need in the buffer
> > lookup table...
> >
> > The indirection with the directory is actually unnecessary for all the
> > shared memory hash tables, since none of them can be resized. I've
> > wondered if we should try to eliminate that from dynahash for all shmem
> > hash tables. But the buffer lookup table is very performance-critical,
> > so if there are any performance gains to be had, it's indeed probably
> > worthwhile to have a separate implementation just for it.
>
> For very large buffer pools, the buffer lookup table spans multiple
> memory pages. With buffer resizing capability it will be good to be
> able to resize the buffer lookup table as well. Right now the patch
> does not resize buffer look up table because of its memory layout and
> complexity involved in that operation. If we are using a different
> data structure for buffer lookup, it will be good to consider ease of
> resizing as well.
>
> --
> Best Wishes,
> Ashutosh Bapat
>

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Melanie Plageman 2026-07-10 19:06:54 Re: Why clearing the VM doesn't require registering vm buffer in wal record
Previous Message Greg Burd 2026-07-10 18:07:55 Re: [PATCH] Batched clock sweep to reduce cross-socket atomic contention