Re: Add bump memory context type and use it for tuplesorts - Mailing list pgsql-hackers
From | Matthias van de Meent |
---|---|
Subject | Re: Add bump memory context type and use it for tuplesorts |
Date | |
Msg-id | CAEze2WiOUWFA-CfFvmrfXSc0OA+YXd_vN0Fzf0ZGpX3qQsYQ8w@mail.gmail.com Whole thread Raw |
In response to | Re: Add bump memory context type and use it for tuplesorts (David Rowley <dgrowleyml@gmail.com>) |
Responses |
Re: Add bump memory context type and use it for tuplesorts
Re: Add bump memory context type and use it for tuplesorts Re: Add bump memory context type and use it for tuplesorts |
List | pgsql-hackers |
On Tue, 11 Jul 2023 at 01:51, David Rowley <dgrowleyml@gmail.com> wrote: > > On Tue, 27 Jun 2023 at 21:19, David Rowley <dgrowleyml@gmail.com> wrote: > > I've attached the bump allocator patch and also the script I used to > > gather the performance results in the first 2 tabs in the attached > > spreadsheet. > > I've attached a v2 patch which changes the BumpContext a little to > remove some of the fields that are not really required. There was no > need for the "keeper" field as the keeper block always comes at the > end of the BumpContext as these are allocated in a single malloc(). > The pointer to the "block" also isn't really needed. This is always > the same as the head element in the blocks dlist. Neat idea, +1. I think it would make sense to split the "add a bump allocator" changes from the "use the bump allocator in tuplesort" patches. Tangent: Do we have specific notes on worst-case memory usage of memory contexts with various allocation patterns? This new bump allocator seems to be quite efficient, but in a worst-case allocation pattern it can still waste about 1/3 of its allocated memory due to never using free space on previous blocks after an allocation didn't fit on that block. It probably isn't going to be a huge problem in general, but this seems like something that could be documented as a potential problem when you're looking for which allocator to use and compare it with other allocators that handle different allocation sizes more gracefully. > +++ b/src/backend/utils/mmgr/bump.c > +BumpBlockIsEmpty(BumpBlock *block) > +{ > + /* it's empty if the freeptr has not moved */ > + return (block->freeptr == (char *) block + Bump_BLOCKHDRSZ); > [...] > +static inline void > +BumpBlockMarkEmpty(BumpBlock *block) > +{ > +#if defined(USE_VALGRIND) || defined(CLOBBER_FREED_MEMORY) > + char *datastart = ((char *) block) + Bump_BLOCKHDRSZ; These two use different definitions of the start pointer. Is that deliberate? > +++ b/src/include/utils/tuplesort.h > @@ -109,7 +109,8 @@ typedef struct TuplesortInstrumentation > * a pointer to the tuple proper (might be a MinimalTuple or IndexTuple), > * which is a separate palloc chunk --- we assume it is just one chunk and > * can be freed by a simple pfree() (except during merge, when we use a > - * simple slab allocator). SortTuples also contain the tuple's first key > + * simple slab allocator and when performing a non-bounded sort where we > + * use a bump allocator). SortTuples also contain the tuple's first key I'd go with something like the following: + * ...(except during merge *where* we use a + * simple slab allocator, and during a non-bounded sort where we + * use a bump allocator). Kind regards, Matthias van de Meent Neon (https://neon.tech)
pgsql-hackers by date: