[PATCH v2] Add malloc micro benchmark

Florian Weimer fweimer@redhat.com
Wed Feb 28 12:57:00 GMT 2018


On 01/05/2018 06:26 PM, Carlos O'Donell wrote:
> It would still be a win if we did not have co-located metadata (something
> Florian whispered into my ear years ago now) for small constant sized blocks.
> 
> We would go from this:
> 
> N * 1-byte allocations => N * (32-byte header
>                                 + 1-byte allocation
>                                 + 15-bytes alignment)
>                            [97% constant waste]

Actually, we have an 8-byte header, a 16-byte alignment requirement, and 
a 24-byte minimum allocation size.  (i386: 4-byte header, 16-byte 
alignment, 12-byte minimum size.)

The non-main arenas actually need only a four-byte chunk header (or even 
fewer bits) because there, the chunk size is very limited.

The alignment is non-negotiable, considering our current stance 
regarding fundamental alignment, even for smaller allocations.

If we introduce heap layout for all arenas (which needs some way to 
compensate for the variable sbrk offset, preferably without wasting a 
gap there), then we should bring down the minimum allocation size to 12 
bytes on 64-bit as well because for the smallest bin, we can use 4-byte 
forward/backward links within a heap, and keep 8-byte pointers separate 
for each heap.

None of this needs algorithm changes, but it's still difficult to 
identify all the places which need changing, due to the code duplication 
and some other issues with the code.

But it only helps with oddly-sized allocations (such as 12 bytes or 28 
bytes), so it is unclear whether this work is worthwhile.

> To this:
> 
> N * 1-byte allocations => N * (1-byte allocation
>                                 + 15-bytes alignment)
>                            + (N/8)-bytes in-use-bit + 16-bytes header
>                            [96% waste for 1-byte]
> 			  [94% waste for 100*1-byte]
>                            ... towards a 93.75% constant waste (limit of the alignment e.g. 15/16)

Another significant win is for allocation sizes such as 32, where we 
currently need to allocate 48 bytes.  In fact, powers-of-two are quite 
bad for the current allocator.

However, it is difficult to combine this with the existing allocator 
because you need to perform some table lookup during free to discover 
whether the pointer has adjacent metadata or not, or waste some address 
space and use bits inside the address for that.

If we want to bring the existing allocator further along, we should 
perhaps try to port dlmalloc changes which get rid of the unsorted bins, 
using balanced binary trees.  I have a feeling that this would allow us 
to consolidate far more often, and this should help us to avoid some of 
the anomalies we have seen.

Thanks,
Florian



More information about the Libc-alpha mailing list