diff options
| author | Qi Wang <interwq@gwu.edu> | 2017-05-16 13:56:00 -0700 |
|---|---|---|
| committer | Qi Wang <interwq@gmail.com> | 2017-05-18 10:04:28 -0700 |
| commit | baf3e294e05ab62b0f80b825a76687c8a1ea001e (patch) | |
| tree | 14ecc60c5d03180436aa975d5ec935b6cfb79b78 | |
| parent | 04fec5e0844bd0cc10dcd290e82f5f6aa486e494 (diff) | |
| download | platform_external_jemalloc_new-baf3e294e05ab62b0f80b825a76687c8a1ea001e.tar.gz platform_external_jemalloc_new-baf3e294e05ab62b0f80b825a76687c8a1ea001e.tar.bz2 platform_external_jemalloc_new-baf3e294e05ab62b0f80b825a76687c8a1ea001e.zip | |
Add stats: arena uptime.
| -rw-r--r-- | doc/jemalloc.xml.in | 12 | ||||
| -rw-r--r-- | include/jemalloc/internal/arena_structs_b.h | 2 | ||||
| -rw-r--r-- | include/jemalloc/internal/stats.h | 3 | ||||
| -rw-r--r-- | src/arena.c | 7 | ||||
| -rw-r--r-- | src/ctl.c | 8 | ||||
| -rw-r--r-- | src/stats.c | 10 |
6 files changed, 42 insertions, 0 deletions
diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in index d1b2e334..1efc9163 100644 --- a/doc/jemalloc.xml.in +++ b/doc/jemalloc.xml.in @@ -2280,6 +2280,18 @@ struct extent_hooks_s { arena.</para></listitem> </varlistentry> + <varlistentry id="stats.arenas.i.uptime"> + <term> + <mallctl>stats.arenas.<i>.uptime</mallctl> + (<type>uint64_t</type>) + <literal>r-</literal> + </term> + <listitem><para>Time elapsed (in nanoseconds) since the arena was + created. If <i> equals <constant>0</constant> or + <constant>MALLCTL_ARENAS_ALL</constant>, this is the uptime since malloc + initialization.</para></listitem> + </varlistentry> + <varlistentry id="stats.arenas.i.pactive"> <term> <mallctl>stats.arenas.<i>.pactive</mallctl> diff --git a/include/jemalloc/internal/arena_structs_b.h b/include/jemalloc/internal/arena_structs_b.h index d98b455e..99e5f6a0 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 385a8514..3f5c20c7 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 045e6127..03680e00 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) { /* @@ -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 34fc37f2..883c7d14 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, |
