Add stats for the size of extent_avail heap
This commit is contained in:
parent
c14e6c0819
commit
126252a7e6
@ -2597,6 +2597,17 @@ struct extent_hooks_s {
|
|||||||
details.</para></listitem>
|
details.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.extent_avail">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.extent_avail</mallctl>
|
||||||
|
(<type>size_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Number of allocated (but unused) extent structs in this
|
||||||
|
arena.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="stats.arenas.i.base">
|
<varlistentry id="stats.arenas.i.base">
|
||||||
<term>
|
<term>
|
||||||
<mallctl>stats.arenas.<i>.base</mallctl>
|
<mallctl>stats.arenas.<i>.base</mallctl>
|
||||||
|
@ -87,6 +87,9 @@ struct arena_stats_s {
|
|||||||
*/
|
*/
|
||||||
atomic_zu_t retained; /* Derived. */
|
atomic_zu_t retained; /* Derived. */
|
||||||
|
|
||||||
|
/* Number of extent_t structs allocated by base, but not being used. */
|
||||||
|
atomic_zu_t extent_avail;
|
||||||
|
|
||||||
arena_stats_decay_t decay_dirty;
|
arena_stats_decay_t decay_dirty;
|
||||||
arena_stats_decay_t decay_muzzy;
|
arena_stats_decay_t decay_muzzy;
|
||||||
|
|
||||||
|
@ -196,6 +196,7 @@ struct arena_s {
|
|||||||
* Synchronization: extent_avail_mtx.
|
* Synchronization: extent_avail_mtx.
|
||||||
*/
|
*/
|
||||||
extent_tree_t extent_avail;
|
extent_tree_t extent_avail;
|
||||||
|
atomic_zu_t extent_avail_cnt;
|
||||||
malloc_mutex_t extent_avail_mtx;
|
malloc_mutex_t extent_avail_mtx;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -100,6 +100,10 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
|
|||||||
arena_stats_accum_zu(&astats->retained,
|
arena_stats_accum_zu(&astats->retained,
|
||||||
extents_npages_get(&arena->extents_retained) << LG_PAGE);
|
extents_npages_get(&arena->extents_retained) << LG_PAGE);
|
||||||
|
|
||||||
|
atomic_store_zu(&astats->extent_avail,
|
||||||
|
atomic_load_zu(&arena->extent_avail_cnt, ATOMIC_RELAXED),
|
||||||
|
ATOMIC_RELAXED);
|
||||||
|
|
||||||
arena_stats_accum_u64(&astats->decay_dirty.npurge,
|
arena_stats_accum_u64(&astats->decay_dirty.npurge,
|
||||||
arena_stats_read_u64(tsdn, &arena->stats,
|
arena_stats_read_u64(tsdn, &arena->stats,
|
||||||
&arena->stats.decay_dirty.npurge));
|
&arena->stats.decay_dirty.npurge));
|
||||||
|
@ -190,6 +190,7 @@ CTL_PROTO(stats_arenas_i_pdirty)
|
|||||||
CTL_PROTO(stats_arenas_i_pmuzzy)
|
CTL_PROTO(stats_arenas_i_pmuzzy)
|
||||||
CTL_PROTO(stats_arenas_i_mapped)
|
CTL_PROTO(stats_arenas_i_mapped)
|
||||||
CTL_PROTO(stats_arenas_i_retained)
|
CTL_PROTO(stats_arenas_i_retained)
|
||||||
|
CTL_PROTO(stats_arenas_i_extent_avail)
|
||||||
CTL_PROTO(stats_arenas_i_dirty_npurge)
|
CTL_PROTO(stats_arenas_i_dirty_npurge)
|
||||||
CTL_PROTO(stats_arenas_i_dirty_nmadvise)
|
CTL_PROTO(stats_arenas_i_dirty_nmadvise)
|
||||||
CTL_PROTO(stats_arenas_i_dirty_purged)
|
CTL_PROTO(stats_arenas_i_dirty_purged)
|
||||||
@ -510,6 +511,7 @@ static const ctl_named_node_t stats_arenas_i_node[] = {
|
|||||||
{NAME("pmuzzy"), CTL(stats_arenas_i_pmuzzy)},
|
{NAME("pmuzzy"), CTL(stats_arenas_i_pmuzzy)},
|
||||||
{NAME("mapped"), CTL(stats_arenas_i_mapped)},
|
{NAME("mapped"), CTL(stats_arenas_i_mapped)},
|
||||||
{NAME("retained"), CTL(stats_arenas_i_retained)},
|
{NAME("retained"), CTL(stats_arenas_i_retained)},
|
||||||
|
{NAME("extent_avail"), CTL(stats_arenas_i_extent_avail)},
|
||||||
{NAME("dirty_npurge"), CTL(stats_arenas_i_dirty_npurge)},
|
{NAME("dirty_npurge"), CTL(stats_arenas_i_dirty_npurge)},
|
||||||
{NAME("dirty_nmadvise"), CTL(stats_arenas_i_dirty_nmadvise)},
|
{NAME("dirty_nmadvise"), CTL(stats_arenas_i_dirty_nmadvise)},
|
||||||
{NAME("dirty_purged"), CTL(stats_arenas_i_dirty_purged)},
|
{NAME("dirty_purged"), CTL(stats_arenas_i_dirty_purged)},
|
||||||
@ -804,6 +806,8 @@ ctl_arena_stats_sdmerge(ctl_arena_t *ctl_sdarena, ctl_arena_t *ctl_arena,
|
|||||||
&astats->astats.mapped);
|
&astats->astats.mapped);
|
||||||
accum_atomic_zu(&sdstats->astats.retained,
|
accum_atomic_zu(&sdstats->astats.retained,
|
||||||
&astats->astats.retained);
|
&astats->astats.retained);
|
||||||
|
accum_atomic_zu(&sdstats->astats.extent_avail,
|
||||||
|
&astats->astats.extent_avail);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge,
|
ctl_accum_arena_stats_u64(&sdstats->astats.decay_dirty.npurge,
|
||||||
@ -2764,6 +2768,10 @@ CTL_RO_CGEN(config_stats, stats_arenas_i_mapped,
|
|||||||
CTL_RO_CGEN(config_stats, stats_arenas_i_retained,
|
CTL_RO_CGEN(config_stats, stats_arenas_i_retained,
|
||||||
atomic_load_zu(&arenas_i(mib[2])->astats->astats.retained, ATOMIC_RELAXED),
|
atomic_load_zu(&arenas_i(mib[2])->astats->astats.retained, ATOMIC_RELAXED),
|
||||||
size_t)
|
size_t)
|
||||||
|
CTL_RO_CGEN(config_stats, stats_arenas_i_extent_avail,
|
||||||
|
atomic_load_zu(&arenas_i(mib[2])->astats->astats.extent_avail,
|
||||||
|
ATOMIC_RELAXED),
|
||||||
|
size_t)
|
||||||
|
|
||||||
CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_npurge,
|
CTL_RO_CGEN(config_stats, stats_arenas_i_dirty_npurge,
|
||||||
ctl_arena_stats_read_u64(
|
ctl_arena_stats_read_u64(
|
||||||
|
@ -186,6 +186,7 @@ extent_alloc(tsdn_t *tsdn, arena_t *arena) {
|
|||||||
return base_alloc_extent(tsdn, arena->base);
|
return base_alloc_extent(tsdn, arena->base);
|
||||||
}
|
}
|
||||||
extent_avail_remove(&arena->extent_avail, extent);
|
extent_avail_remove(&arena->extent_avail, extent);
|
||||||
|
atomic_fetch_sub_zu(&arena->extent_avail_cnt, 1, ATOMIC_RELAXED);
|
||||||
malloc_mutex_unlock(tsdn, &arena->extent_avail_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extent_avail_mtx);
|
||||||
return extent;
|
return extent;
|
||||||
}
|
}
|
||||||
@ -194,6 +195,7 @@ void
|
|||||||
extent_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *extent) {
|
extent_dalloc(tsdn_t *tsdn, arena_t *arena, extent_t *extent) {
|
||||||
malloc_mutex_lock(tsdn, &arena->extent_avail_mtx);
|
malloc_mutex_lock(tsdn, &arena->extent_avail_mtx);
|
||||||
extent_avail_insert(&arena->extent_avail, extent);
|
extent_avail_insert(&arena->extent_avail, extent);
|
||||||
|
atomic_fetch_add_zu(&arena->extent_avail_cnt, 1, ATOMIC_RELAXED);
|
||||||
malloc_mutex_unlock(tsdn, &arena->extent_avail_mtx);
|
malloc_mutex_unlock(tsdn, &arena->extent_avail_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,7 +628,7 @@ stats_arena_print(emitter_t *emitter, unsigned i, bool bins, bool large,
|
|||||||
const char *dss;
|
const char *dss;
|
||||||
ssize_t dirty_decay_ms, muzzy_decay_ms;
|
ssize_t dirty_decay_ms, muzzy_decay_ms;
|
||||||
size_t page, pactive, pdirty, pmuzzy, mapped, retained;
|
size_t page, pactive, pdirty, pmuzzy, mapped, retained;
|
||||||
size_t base, internal, resident, metadata_thp;
|
size_t base, internal, resident, metadata_thp, extent_avail;
|
||||||
uint64_t dirty_npurge, dirty_nmadvise, dirty_purged;
|
uint64_t dirty_npurge, dirty_nmadvise, dirty_purged;
|
||||||
uint64_t muzzy_npurge, muzzy_nmadvise, muzzy_purged;
|
uint64_t muzzy_npurge, muzzy_nmadvise, muzzy_purged;
|
||||||
size_t small_allocated;
|
size_t small_allocated;
|
||||||
@ -911,6 +911,7 @@ stats_arena_print(emitter_t *emitter, unsigned i, bool bins, bool large,
|
|||||||
GET_AND_EMIT_MEM_STAT(metadata_thp)
|
GET_AND_EMIT_MEM_STAT(metadata_thp)
|
||||||
GET_AND_EMIT_MEM_STAT(tcache_bytes)
|
GET_AND_EMIT_MEM_STAT(tcache_bytes)
|
||||||
GET_AND_EMIT_MEM_STAT(resident)
|
GET_AND_EMIT_MEM_STAT(resident)
|
||||||
|
GET_AND_EMIT_MEM_STAT(extent_avail)
|
||||||
#undef GET_AND_EMIT_MEM_STAT
|
#undef GET_AND_EMIT_MEM_STAT
|
||||||
|
|
||||||
if (mutex) {
|
if (mutex) {
|
||||||
|
Loading…
Reference in New Issue
Block a user