Over purge by 1 extent always.
When purging, large allocations are usually the ones that cross the npages_limit threshold, simply because they are "large". This means we often leave the large extent around for a while, which has the downsides of: 1) high RSS and 2) more chance of them getting fragmented. Given that they are not likely to be reused very soon (LRU), let's over purge by 1 extent (which is often large and not reused frequently).
This commit is contained in:
parent
f70785de91
commit
740bdd68b1
@ -38,8 +38,7 @@ extent_t *extents_alloc(tsdn_t *tsdn, arena_t *arena,
|
|||||||
void extents_dalloc(tsdn_t *tsdn, arena_t *arena,
|
void extents_dalloc(tsdn_t *tsdn, arena_t *arena,
|
||||||
extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent);
|
extent_hooks_t **r_extent_hooks, extents_t *extents, extent_t *extent);
|
||||||
extent_t *extents_evict(tsdn_t *tsdn, arena_t *arena,
|
extent_t *extents_evict(tsdn_t *tsdn, arena_t *arena,
|
||||||
extent_hooks_t **r_extent_hooks, extents_t *extents, size_t npages_min,
|
extent_hooks_t **r_extent_hooks, extents_t *extents, size_t npages_min);
|
||||||
size_t npages_max);
|
|
||||||
void extents_prefork(tsdn_t *tsdn, extents_t *extents);
|
void extents_prefork(tsdn_t *tsdn, extents_t *extents);
|
||||||
void extents_postfork_parent(tsdn_t *tsdn, extents_t *extents);
|
void extents_postfork_parent(tsdn_t *tsdn, extents_t *extents);
|
||||||
void extents_postfork_child(tsdn_t *tsdn, extents_t *extents);
|
void extents_postfork_child(tsdn_t *tsdn, extents_t *extents);
|
||||||
|
@ -912,7 +912,7 @@ arena_stash_decayed(tsdn_t *tsdn, arena_t *arena,
|
|||||||
extent_t *extent;
|
extent_t *extent;
|
||||||
while (nstashed < npages_decay_max &&
|
while (nstashed < npages_decay_max &&
|
||||||
(extent = extents_evict(tsdn, arena, r_extent_hooks, extents,
|
(extent = extents_evict(tsdn, arena, r_extent_hooks, extents,
|
||||||
npages_limit, npages_decay_max - nstashed)) != NULL) {
|
npages_limit)) != NULL) {
|
||||||
extent_list_append(decay_extents, extent);
|
extent_list_append(decay_extents, extent);
|
||||||
nstashed += extent_size_get(extent) >> LG_PAGE;
|
nstashed += extent_size_get(extent) >> LG_PAGE;
|
||||||
}
|
}
|
||||||
@ -1226,7 +1226,7 @@ arena_destroy_retained(tsdn_t *tsdn, arena_t *arena) {
|
|||||||
extent_hooks_t *extent_hooks = extent_hooks_get(arena);
|
extent_hooks_t *extent_hooks = extent_hooks_get(arena);
|
||||||
extent_t *extent;
|
extent_t *extent;
|
||||||
while ((extent = extents_evict(tsdn, arena, &extent_hooks,
|
while ((extent = extents_evict(tsdn, arena, &extent_hooks,
|
||||||
&arena->extents_retained, 0, SIZE_MAX)) != NULL) {
|
&arena->extents_retained, 0)) != NULL) {
|
||||||
extent_destroy_wrapper(tsdn, arena, &extent_hooks, extent);
|
extent_destroy_wrapper(tsdn, arena, &extent_hooks, extent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -481,7 +481,7 @@ extents_dalloc(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||||||
|
|
||||||
extent_t *
|
extent_t *
|
||||||
extents_evict(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
extents_evict(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
||||||
extents_t *extents, size_t npages_min, size_t npages_max) {
|
extents_t *extents, size_t npages_min) {
|
||||||
rtree_ctx_t rtree_ctx_fallback;
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
|
||||||
|
|
||||||
@ -499,11 +499,9 @@ extents_evict(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||||||
goto label_return;
|
goto label_return;
|
||||||
}
|
}
|
||||||
/* Check the eviction limit. */
|
/* Check the eviction limit. */
|
||||||
size_t npages = extent_size_get(extent) >> LG_PAGE;
|
|
||||||
size_t extents_npages = atomic_load_zu(&extents->npages,
|
size_t extents_npages = atomic_load_zu(&extents->npages,
|
||||||
ATOMIC_RELAXED);
|
ATOMIC_RELAXED);
|
||||||
if (extents_npages - npages < npages_min ||
|
if (extents_npages <= npages_min) {
|
||||||
npages > npages_max) {
|
|
||||||
extent = NULL;
|
extent = NULL;
|
||||||
goto label_return;
|
goto label_return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user