Skip to content
  • Teo Camarasu's avatar
    b38dcf39
    rts: Allocate non-moving segments with megablocks · b38dcf39
    Teo Camarasu authored and Marge Bot's avatar Marge Bot committed
    Non-moving segments are 8 blocks long and need to be aligned.
    Previously we serviced allocations by grabbing 15 blocks, finding
    an aligned 8 block group in it and returning the rest.
    This proved to lead to high levels of fragmentation as a de-allocating a segment
    caused an 8 block gap to form, and this could not be reused for allocation.
    
    This patch introduces a segment allocator based around using entire
    megablocks to service segment allocations in bulk.
    
    When there are no free segments, we grab an entire megablock and fill it
    with aligned segments. As the megablock is free, we can easily guarantee
    alignment. Any unused segments are placed on a free list.
    
    It only makes sense to free segments in bulk when all of the segments in
    a megablock are freeable. After sweeping, we grab the free list, sort it,
    and find all groups of segments where they cover the megablock and free
    them.
    This introduces a period of time when free segments are not available to
    the mutator, but the risk that this would lead to excessive allocation
    is low. Right after sweep, we should have an abundance of partially full
    segments, and this pruning step is relatively quick.
    
    In implementing this we drop the logic that kept NONMOVING_MAX_FREE
    segments on the free list.
    
    We also introduce an eventlog event to log the amount of pruned/retained
    free segments.
    
    See Note [Segment allocation strategy]
    
    Resolves #24150
    
    -------------------------
    Metric Decrease:
        T13253
        T19695
    -------------------------
    b38dcf39
    rts: Allocate non-moving segments with megablocks
    Teo Camarasu authored and Marge Bot's avatar Marge Bot committed
    Non-moving segments are 8 blocks long and need to be aligned.
    Previously we serviced allocations by grabbing 15 blocks, finding
    an aligned 8 block group in it and returning the rest.
    This proved to lead to high levels of fragmentation as a de-allocating a segment
    caused an 8 block gap to form, and this could not be reused for allocation.
    
    This patch introduces a segment allocator based around using entire
    megablocks to service segment allocations in bulk.
    
    When there are no free segments, we grab an entire megablock and fill it
    with aligned segments. As the megablock is free, we can easily guarantee
    alignment. Any unused segments are placed on a free list.
    
    It only makes sense to free segments in bulk when all of the segments in
    a megablock are freeable. After sweeping, we grab the free list, sort it,
    and find all groups of segments where they cover the megablock and free
    them.
    This introduces a period of time when free segments are not available to
    the mutator, but the risk that this would lead to excessive allocation
    is low. Right after sweep, we should have an abundance of partially full
    segments, and this pruning step is relatively quick.
    
    In implementing this we drop the logic that kept NONMOVING_MAX_FREE
    segments on the free list.
    
    We also introduce an eventlog event to log the amount of pruned/retained
    free segments.
    
    See Note [Segment allocation strategy]
    
    Resolves #24150
    
    -------------------------
    Metric Decrease:
        T13253
        T19695
    -------------------------
Loading