Re: Adding skip scan (including MDAM style range skip scan) to nbtree - Mailing list pgsql-hackers

From Tomas Vondra
Subject Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Date
Msg-id 8af20905-2cc5-4f1a-b2a2-ca59882aa880@vondra.me
Whole thread Raw
In response to Re: Adding skip scan (including MDAM style range skip scan) to nbtree  (Peter Geoghegan <pg@bowt.ie>)
Responses Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Re: Adding skip scan (including MDAM style range skip scan) to nbtree
Re: Adding skip scan (including MDAM style range skip scan) to nbtree
List pgsql-hackers
Hi,

While doing some benchmarks to compare 17 vs. 18, I ran into a
regression that I ultimately tracked to commit 92fe23d93aa.

    commit 92fe23d93aa3bbbc40fca669cabc4a4d7975e327
    Author: Peter Geoghegan <pg@bowt.ie>
    Date:   Fri Apr 4 12:27:04 2025 -0400

    Add nbtree skip scan optimization.

The workload is very simple - pgbench scale 1 with 100 partitions, an
extra index and a custom select script (same as the other regression I
just reported, but with low client counts):

  pg_ctl -D data init
  pg_ctl -D data -l pg.log start

  createdb test

  psql test -c 'create index on pgbench_accounts(bid)'

and a custom script with a single query:

  select count(*) from pgbench_accounts where bid = 0

and then simply run this for a couple client counts:

  for m in simple prepared; do
    for c in 1 4 32; do
      pgbench -n -f select.sql -M $m -T 10 -c $c -j $c test | grep tps;
    done;
  done;

And the results for 92fe23d93aa and 3ba2cdaa454 (the commit prior to the
skip scan one) look like this:

  mode       #c    3ba2cdaa454     92fe23d93aa      diff
  -------------------------------------------------------
  simple      1           2617            1832       70%
              4           8332            6260       75%
             32          11603            7110       61%
  ------------------------------------------------------
  prepared    1          11113            3646       33%
              4          25379           11375       45%
             32          37319           14097       38%

The number are throughput, as reported by pgbench, and for this
workload, we're often losing ~50% of throughput with 92fe23d93aa.

Despite that, I'm not entirely sure how serious this is. This was meant
to be a micro-benchmark stressing the locking, but maybe it's considered
unrealistic in practice. Not sure.

I'm also not sure about the root cause, but while investigating it one
of the experiments I tried was tweaking the glibc malloc by setting

    export MALLOC_TOP_PAD_=$((64*1024*1024))

which keeps a 64MB "buffer" in glibc, to reduce the amount of malloc
syscalls. And with that, the results change to this:

  mode       #c    3ba2cdaa454     92fe23d93aa      diff
  -------------------------------------------------------
  simple      1           3168            3153      100%
              4           9172            9171      100%
             32          12425           13248      107%
  ------------------------------------------------------
  prepared    1          11104           11460      103%
              4          25481           25737      101%
             32          36795           38372      104%

So the difference disappears - what remains is essentially run to run
variability. The throughout actually improves a little bit for 3ba2cd.

My conclusion from this is that 92fe23d93aa ends up doing a lot of
malloc calls, and this is what makes causes the regression. Otherwise
setting the MALLOC_TOP_PAD_ would not help like this. But I haven't
looked at the code, and I wouldn't have guessed the query to have
anything to do with skip scan ...


regards

-- 
Tomas Vondra




pgsql-hackers by date:

Previous
From: Aleksander Alekseev
Date:
Subject: Re: strange perf regression with data checksums
Next
From: Tomas Vondra
Date:
Subject: Re: strange perf regression with data checksums