aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQi Wang <interwq@gwu.edu>2017-05-16 13:56:00 -0700
committerQi Wang <interwq@gmail.com>2017-05-18 10:04:28 -0700
commitbaf3e294e05ab62b0f80b825a76687c8a1ea001e (patch)
tree14ecc60c5d03180436aa975d5ec935b6cfb79b78
parent04fec5e0844bd0cc10dcd290e82f5f6aa486e494 (diff)
downloadplatform_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.in12
-rw-r--r--include/jemalloc/internal/arena_structs_b.h2
-rw-r--r--include/jemalloc/internal/stats.h3
-rw-r--r--src/arena.c7
-rw-r--r--src/ctl.c8
-rw-r--r--src/stats.c10
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.&lt;i&gt;.uptime</mallctl>
+ (<type>uint64_t</type>)
+ <literal>r-</literal>
+ </term>
+ <listitem><para>Time elapsed (in nanoseconds) since the arena was
+ created. If &lt;i&gt; 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.&lt;i&gt;.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) {
/*
diff --git a/src/ctl.c b/src/ctl.c
index 7d53a336..79f2447f 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 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,