Re: Reducing the chunk header sizes on all memory context types - Mailing list pgsql-hackers
From | Tomas Vondra |
---|---|
Subject | Re: Reducing the chunk header sizes on all memory context types |
Date | |
Msg-id | a6ab9367-bcf4-116a-39b7-c9b1afbe8cfc@enterprisedb.com Whole thread Raw |
In response to | Re: Reducing the chunk header sizes on all memory context types (David Rowley <dgrowleyml@gmail.com>) |
Responses |
Re: Reducing the chunk header sizes on all memory context types
|
List | pgsql-hackers |
On 8/31/22 23:46, David Rowley wrote: > On Thu, 1 Sept 2022 at 08:53, Tomas Vondra > <tomas.vondra@enterprisedb.com> wrote: >> So the raw size (what we asked for) is ~23.5GB, but in practice we >> allocate ~28.8GB because of the pow-of-2 logic. And by adding the extra >> 1B we end up allocating 31.5GB. That doesn't seem like a huge increase, >> and it's far from the +60% you got. >> >> I wonder where does the difference come - I did make installcheck too, >> so how come you get 10/16GB, and I get 28/31GB? My patch is attached, >> maybe I did something silly. > > The reason my reported results were lower is because I ignored size > > allocChunkLimit allocations. These are not raised to the next power of > 2, so I didn't think they should be included. If I differentiate the large chunks allocated separately (v2 patch attached), I get this: f | t | count | s1 | s2 | s3 -----------------+----------+----------+----------+----------+---------- AllocSetAlloc | normal | 60714914 | 4982 | 6288 | 8185 AllocSetAlloc | separate | 824390 | 18245 | 18245 | 18251 AllocSetRelloc | normal | 182070 | 763 | 826 | 1423 GenerationAlloc | normal | 2118115 | 68 | 90 | 102 GenerationAlloc | separate | 28 | 0 | 0 | 0 (5 rows) Where s1 is the sum of requested sizes, s2 is the sum of allocated chunks, and s3 is chunks allocated with 1B sentinel. Focusing on the aset, vast majority of allocations (60M out of 64M) is small enough to use power-of-2 logic, and we go from 6.3GB to 8.2GB, so ~30%. Not great, not terrible. For the large allocations, there's almost no increase - in the last query I used the power-of-2 logic in the calculations, but that was incorrect, of course. > > I'm not sure why you're seeing only a 3GB additional overhead. I > noticed a logic error in my query where I was checking > maxaligned_size=pow2_size and doubling that to give sentinel space. > That really should have been "case size=pow2_size then pow2_size * 2 > else pow2_size end", However, after adjusting the query, it does not > seem to change the results much: > > postgres=# select > postgres-# round(sum(pow2_Size)::numeric/1024/1024/1024,3) as pow2_size, > postgres-# round(sum(case when size=pow2_size then pow2_size*2 else > pow2_size end)::numeric/1024/1024/1024,3) as method1, > postgres-# round(sum(case when size=pow2_size then pow2_size+8 else > pow2_size end)::numeric/1024/1024/1024,3) as method2 > postgres-# from memstats > postgres-# where pow2_size > 0; > pow2_size | method1 | method2 > -----------+---------+--------- > 10.269 | 16.322 | 10.476 > > I've attached the crude patch I came up with for this. For some > reason it was crashing on Linux, but it ran ok on Windows, so I used > the results from that instead. Maybe that accounts for some > differences as e.g sizeof(long) == 4 on 64-bit windows. I'd be > surprised if that accounted for so many GBs though. > I tried to use that patch, but "make installcheck" never completes for me, for some reason. It seems to get stuck in infinite_recurse.sql, but I haven't looked into the details. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Attachment
pgsql-hackers by date: