From baf3e294e05ab62b0f80b825a76687c8a1ea001e Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Tue, 16 May 2017 13:56:00 -0700 Subject: Add stats: arena uptime. --- doc/jemalloc.xml.in | 12 ++++++++++++ include/jemalloc/internal/arena_structs_b.h | 2 ++ include/jemalloc/internal/stats.h | 3 +++ src/arena.c | 7 +++++++ src/ctl.c | 8 ++++++++ src/stats.c | 10 ++++++++++ 6 files changed, 42 insertions(+) diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in index d1b2e33..1efc916 100644 --- a/doc/jemalloc.xml.in +++ b/doc/jemalloc.xml.in @@ -2280,6 +2280,18 @@ struct extent_hooks_s { arena. + + + stats.arenas.<i>.uptime + (uint64_t) + r- + + Time elapsed (in nanoseconds) since the arena was + created. If <i> equals 0 or + MALLCTL_ARENAS_ALL, this is the uptime since malloc + initialization. + + stats.arenas.<i>.pactive diff --git a/include/jemalloc/internal/arena_structs_b.h b/include/jemalloc/internal/arena_structs_b.h index d98b455..99e5f6a 100644 --- a/include/jemalloc/internal/arena_structs_b.h +++ b/include/jemalloc/internal/arena_structs_b.h @@ -261,6 +261,8 @@ struct arena_s { * Synchronization: internal. */ base_t *base; + /* Used to determine uptime. Read-only after initialization. */ + nstime_t create_time; }; /* Used in conjunction with tsd for fast arena-related context lookup. */ diff --git a/include/jemalloc/internal/stats.h b/include/jemalloc/internal/stats.h index 385a851..3f5c20c 100644 --- a/include/jemalloc/internal/stats.h +++ b/include/jemalloc/internal/stats.h @@ -145,6 +145,9 @@ typedef struct arena_stats_s { /* One element for each large size class. */ malloc_large_stats_t lstats[NSIZES - NBINS]; + + /* Arena uptime. */ + nstime_t uptime; } arena_stats_t; #endif /* JEMALLOC_INTERNAL_STATS_H */ diff --git a/src/arena.c b/src/arena.c index 045e612..03680e0 100644 --- a/src/arena.c +++ b/src/arena.c @@ -330,6 +330,10 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads, arena_prof_mutex_base) #undef READ_ARENA_MUTEX_PROF_DATA + nstime_copy(&astats->uptime, &arena->create_time); + nstime_update(&astats->uptime); + nstime_subtract(&astats->uptime, &arena->create_time); + for (szind_t i = 0; i < NBINS; i++) { arena_bin_t *bin = &arena->bins[i]; @@ -1965,6 +1969,9 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { arena->base = base; + nstime_init(&arena->create_time, 0); + nstime_update(&arena->create_time); + /* We don't support reetrancy for arena 0 bootstrapping. */ if (ind != 0 && hooks_arena_new_hook) { /* diff --git a/src/ctl.c b/src/ctl.c index 7d53a33..79f2447 100644 --- a/src/ctl.c +++ b/src/ctl.c @@ -157,6 +157,7 @@ CTL_PROTO(stats_arenas_i_lextents_j_nrequests) CTL_PROTO(stats_arenas_i_lextents_j_curlextents) INDEX_PROTO(stats_arenas_i_lextents_j) CTL_PROTO(stats_arenas_i_nthreads) +CTL_PROTO(stats_arenas_i_uptime) CTL_PROTO(stats_arenas_i_dss) CTL_PROTO(stats_arenas_i_dirty_decay_time) CTL_PROTO(stats_arenas_i_muzzy_decay_time) @@ -441,6 +442,7 @@ MUTEX_PROF_ARENA_MUTEXES static const ctl_named_node_t stats_arenas_i_node[] = { {NAME("nthreads"), CTL(stats_arenas_i_nthreads)}, + {NAME("uptime"), CTL(stats_arenas_i_uptime)}, {NAME("dss"), CTL(stats_arenas_i_dss)}, {NAME("dirty_decay_time"), CTL(stats_arenas_i_dirty_decay_time)}, {NAME("muzzy_decay_time"), CTL(stats_arenas_i_muzzy_decay_time)}, @@ -778,6 +780,10 @@ MUTEX_PROF_ARENA_MUTEXES accum_atomic_zu(&sdstats->astats.tcache_bytes, &astats->astats.tcache_bytes); + if (ctl_arena->arena_ind == 0) { + sdstats->astats.uptime = astats->astats.uptime; + } + for (i = 0; i < NBINS; i++) { sdstats->bstats[i].nmalloc += astats->bstats[i].nmalloc; sdstats->bstats[i].ndalloc += astats->bstats[i].ndalloc; @@ -2317,6 +2323,8 @@ CTL_RO_GEN(stats_arenas_i_dirty_decay_time, arenas_i(mib[2])->dirty_decay_time, CTL_RO_GEN(stats_arenas_i_muzzy_decay_time, arenas_i(mib[2])->muzzy_decay_time, ssize_t) CTL_RO_GEN(stats_arenas_i_nthreads, arenas_i(mib[2])->nthreads, unsigned) +CTL_RO_GEN(stats_arenas_i_uptime, + nstime_ns(&arenas_i(mib[2])->astats->astats.uptime), uint64_t) CTL_RO_GEN(stats_arenas_i_pactive, arenas_i(mib[2])->pactive, size_t) CTL_RO_GEN(stats_arenas_i_pdirty, arenas_i(mib[2])->pdirty, size_t) CTL_RO_GEN(stats_arenas_i_pmuzzy, arenas_i(mib[2])->pmuzzy, size_t) diff --git a/src/stats.c b/src/stats.c index 34fc37f..883c7d1 100644 --- a/src/stats.c +++ b/src/stats.c @@ -421,6 +421,7 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, size_t large_allocated; uint64_t large_nmalloc, large_ndalloc, large_nrequests; size_t tcache_bytes; + uint64_t uptime; CTL_GET("arenas.page", &page, size_t); @@ -433,6 +434,15 @@ stats_arena_print(void (*write_cb)(void *, const char *), void *cbopaque, "assigned threads: %u\n", nthreads); } + CTL_M2_GET("stats.arenas.0.uptime", i, &uptime, uint64_t); + if (json) { + malloc_cprintf(write_cb, cbopaque, + "\t\t\t\t\"uptime_ns\": %"FMTu64",\n", uptime); + } else { + malloc_cprintf(write_cb, cbopaque, + "uptime: %"FMTu64"\n", uptime); + } + CTL_M2_GET("stats.arenas.0.dss", i, &dss, const char *); if (json) { malloc_cprintf(write_cb, cbopaque, -- cgit v0.12