pgsql: Use bump memory context for tuplesorts

Started by David Rowleyabout 2 years ago4 messagescomitters
Jump to latest
#1David Rowley
dgrowleyml@gmail.com

Use bump memory context for tuplesorts

29f6a959c added a bump allocator type for efficient compact allocations.
Here we make use of this for non-bounded tuplesorts to store tuples.
This is very space efficient when storing narrow tuples due to bump.c
not having chunk headers. This means we can fit more tuples in work_mem
before spilling to disk, or perform an in-memory sort touching fewer
cacheline.

Author: David Rowley
Reviewed-by: Nathan Bossart
Reviewed-by: Matthias van de Meent
Reviewed-by: Tomas Vondra
Reviewed-by: John Naylor
Discussion: /messages/by-id/CAApHDvqGSpCU95TmM=Bp=6xjL_nLys4zdZOpfNyWBk97Xrdj2w@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/6ed83d5fa55cf6e6c9d1be34ec10730c48eba763

Modified Files
--------------
src/backend/utils/sort/tuplesort.c | 52 +++++++++++++++++-------------
src/backend/utils/sort/tuplesortvariants.c | 38 +++++++++++++++++++---
src/include/utils/tuplesort.h | 21 +++++++++---
3 files changed, 78 insertions(+), 33 deletions(-)

#2Melanie Plageman
melanieplageman@gmail.com
In reply to: David Rowley (#1)
Re: pgsql: Use bump memory context for tuplesorts

On Sun, Apr 7, 2024 at 8:32 AM David Rowley <drowley@postgresql.org> wrote:

Use bump memory context for tuplesorts

29f6a959c added a bump allocator type for efficient compact allocations.
Here we make use of this for non-bounded tuplesorts to store tuples.
This is very space efficient when storing narrow tuples due to bump.c
not having chunk headers. This means we can fit more tuples in work_mem
before spilling to disk, or perform an in-memory sort touching fewer
cacheline.

Looks like this assert is tripping on grison [1]https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=grison&amp;dt=2024-04-07%2014%3A10%3A09.

running bootstrap script ... TRAP: failed Assert("total_allocated ==
context->mem_allocated"), File: "bump.c", Line: 808, PID: 30248

[1]: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=grison&amp;dt=2024-04-07%2014%3A10%3A09

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Melanie Plageman (#2)
Re: pgsql: Use bump memory context for tuplesorts

Melanie Plageman <melanieplageman@gmail.com> writes:

Looks like this assert is tripping on grison [1].

running bootstrap script ... TRAP: failed Assert("total_allocated ==
context->mem_allocated"), File: "bump.c", Line: 808, PID: 30248

The same on mamba. However, I failed to duplicate it in an x86
(32-bit) VM. I think the critical factor on the failing machines
is that MAXALIGN is 8 which is more than their sizeof(pointer).

regards, tom lane

#4Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#3)
Re: pgsql: Use bump memory context for tuplesorts

Hi,

On 2024-04-07 13:52:28 -0400, Tom Lane wrote:

Melanie Plageman <melanieplageman@gmail.com> writes:

Looks like this assert is tripping on grison [1].

running bootstrap script ... TRAP: failed Assert("total_allocated ==
context->mem_allocated"), File: "bump.c", Line: 808, PID: 30248

The same on mamba. However, I failed to duplicate it in an x86
(32-bit) VM. I think the critical factor on the failing machines
is that MAXALIGN is 8 which is more than their sizeof(pointer).

For posterity: I think the above is correct, and that I found the concrete
reason this causes issues on the thread related to the patch. I posted there
because I figured it out after looking at Tomas' gdb output:

/messages/by-id/20240407210924.fvwfwbzms3bvtfcd@awork3.anarazel.de

- Andres