Output prof stats in stats print
This commit is contained in:
parent
1f1a0231ed
commit
9f71b5779b
98
src/stats.c
98
src/stats.c
@ -6,6 +6,7 @@
|
|||||||
#include "jemalloc/internal/emitter.h"
|
#include "jemalloc/internal/emitter.h"
|
||||||
#include "jemalloc/internal/mutex.h"
|
#include "jemalloc/internal/mutex.h"
|
||||||
#include "jemalloc/internal/mutex_prof.h"
|
#include "jemalloc/internal/mutex_prof.h"
|
||||||
|
#include "jemalloc/internal/prof_stats.h"
|
||||||
|
|
||||||
const char *global_mutex_names[mutex_prof_num_global_mutexes] = {
|
const char *global_mutex_names[mutex_prof_num_global_mutexes] = {
|
||||||
#define OP(mtx) #mtx,
|
#define OP(mtx) #mtx,
|
||||||
@ -298,7 +299,8 @@ mutex_stats_emit(emitter_t *emitter, emitter_row_t *row,
|
|||||||
|
|
||||||
JEMALLOC_COLD
|
JEMALLOC_COLD
|
||||||
static void
|
static void
|
||||||
stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t uptime) {
|
stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i,
|
||||||
|
uint64_t uptime) {
|
||||||
size_t page;
|
size_t page;
|
||||||
bool in_gap, in_gap_prev;
|
bool in_gap, in_gap_prev;
|
||||||
unsigned nbins, j;
|
unsigned nbins, j;
|
||||||
@ -313,6 +315,9 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
emitter_row_t row;
|
emitter_row_t row;
|
||||||
emitter_row_init(&row);
|
emitter_row_init(&row);
|
||||||
|
|
||||||
|
bool prof_stats_on = config_prof && opt_prof && opt_prof_stats
|
||||||
|
&& i == MALLCTL_ARENAS_ALL;
|
||||||
|
|
||||||
COL_HDR(row, size, NULL, right, 20, size)
|
COL_HDR(row, size, NULL, right, 20, size)
|
||||||
COL_HDR(row, ind, NULL, right, 4, unsigned)
|
COL_HDR(row, ind, NULL, right, 4, unsigned)
|
||||||
COL_HDR(row, allocated, NULL, right, 13, uint64)
|
COL_HDR(row, allocated, NULL, right, 13, uint64)
|
||||||
@ -322,6 +327,16 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
COL_HDR(row, ndalloc_ps, "(#/sec)", right, 8, uint64)
|
COL_HDR(row, ndalloc_ps, "(#/sec)", right, 8, uint64)
|
||||||
COL_HDR(row, nrequests, NULL, right, 13, uint64)
|
COL_HDR(row, nrequests, NULL, right, 13, uint64)
|
||||||
COL_HDR(row, nrequests_ps, "(#/sec)", right, 10, uint64)
|
COL_HDR(row, nrequests_ps, "(#/sec)", right, 10, uint64)
|
||||||
|
COL_HDR_DECLARE(prof_live_requested);
|
||||||
|
COL_HDR_DECLARE(prof_live_count);
|
||||||
|
COL_HDR_DECLARE(prof_accum_requested);
|
||||||
|
COL_HDR_DECLARE(prof_accum_count);
|
||||||
|
if (prof_stats_on) {
|
||||||
|
COL_HDR_INIT(row, prof_live_requested, NULL, right, 21, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_live_count, NULL, right, 17, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_accum_requested, NULL, right, 21, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_accum_count, NULL, right, 17, uint64)
|
||||||
|
}
|
||||||
COL_HDR(row, nshards, NULL, right, 9, unsigned)
|
COL_HDR(row, nshards, NULL, right, 9, unsigned)
|
||||||
COL_HDR(row, curregs, NULL, right, 13, size)
|
COL_HDR(row, curregs, NULL, right, 13, size)
|
||||||
COL_HDR(row, curslabs, NULL, right, 13, size)
|
COL_HDR(row, curslabs, NULL, right, 13, size)
|
||||||
@ -373,6 +388,11 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
size_t arenas_bin_mib[CTL_MAX_DEPTH];
|
size_t arenas_bin_mib[CTL_MAX_DEPTH];
|
||||||
CTL_LEAF_PREPARE(arenas_bin_mib, 0, "arenas.bin");
|
CTL_LEAF_PREPARE(arenas_bin_mib, 0, "arenas.bin");
|
||||||
|
|
||||||
|
size_t prof_stats_mib[CTL_MAX_DEPTH];
|
||||||
|
if (prof_stats_on) {
|
||||||
|
CTL_LEAF_PREPARE(prof_stats_mib, 0, "prof.stats.bins");
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0, in_gap = false; j < nbins; j++) {
|
for (j = 0, in_gap = false; j < nbins; j++) {
|
||||||
uint64_t nslabs;
|
uint64_t nslabs;
|
||||||
size_t reg_size, slab_size, curregs;
|
size_t reg_size, slab_size, curregs;
|
||||||
@ -381,14 +401,28 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
uint32_t nregs, nshards;
|
uint32_t nregs, nshards;
|
||||||
uint64_t nmalloc, ndalloc, nrequests, nfills, nflushes;
|
uint64_t nmalloc, ndalloc, nrequests, nfills, nflushes;
|
||||||
uint64_t nreslabs;
|
uint64_t nreslabs;
|
||||||
|
prof_stats_t prof_live;
|
||||||
|
prof_stats_t prof_accum;
|
||||||
|
|
||||||
stats_arenas_mib[4] = j;
|
stats_arenas_mib[4] = j;
|
||||||
arenas_bin_mib[2] = j;
|
arenas_bin_mib[2] = j;
|
||||||
|
|
||||||
CTL_LEAF(stats_arenas_mib, 5, "nslabs", &nslabs, uint64_t);
|
CTL_LEAF(stats_arenas_mib, 5, "nslabs", &nslabs, uint64_t);
|
||||||
|
|
||||||
|
if (prof_stats_on) {
|
||||||
|
prof_stats_mib[3] = j;
|
||||||
|
CTL_LEAF(prof_stats_mib, 4, "live", &prof_live,
|
||||||
|
prof_stats_t);
|
||||||
|
CTL_LEAF(prof_stats_mib, 4, "accum", &prof_accum,
|
||||||
|
prof_stats_t);
|
||||||
|
}
|
||||||
|
|
||||||
in_gap_prev = in_gap;
|
in_gap_prev = in_gap;
|
||||||
|
if (prof_stats_on) {
|
||||||
|
in_gap = (nslabs == 0 && prof_accum.count == 0);
|
||||||
|
} else {
|
||||||
in_gap = (nslabs == 0);
|
in_gap = (nslabs == 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (in_gap_prev && !in_gap) {
|
if (in_gap_prev && !in_gap) {
|
||||||
emitter_table_printf(emitter,
|
emitter_table_printf(emitter,
|
||||||
@ -429,6 +463,16 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
&curregs);
|
&curregs);
|
||||||
emitter_json_kv(emitter, "nrequests", emitter_type_uint64,
|
emitter_json_kv(emitter, "nrequests", emitter_type_uint64,
|
||||||
&nrequests);
|
&nrequests);
|
||||||
|
if (prof_stats_on) {
|
||||||
|
emitter_json_kv(emitter, "prof_live_requested",
|
||||||
|
emitter_type_uint64, &prof_live.req_sum);
|
||||||
|
emitter_json_kv(emitter, "prof_live_count",
|
||||||
|
emitter_type_uint64, &prof_live.count);
|
||||||
|
emitter_json_kv(emitter, "prof_accum_requested",
|
||||||
|
emitter_type_uint64, &prof_accum.req_sum);
|
||||||
|
emitter_json_kv(emitter, "prof_accum_count",
|
||||||
|
emitter_type_uint64, &prof_accum.count);
|
||||||
|
}
|
||||||
emitter_json_kv(emitter, "nfills", emitter_type_uint64,
|
emitter_json_kv(emitter, "nfills", emitter_type_uint64,
|
||||||
&nfills);
|
&nfills);
|
||||||
emitter_json_kv(emitter, "nflushes", emitter_type_uint64,
|
emitter_json_kv(emitter, "nflushes", emitter_type_uint64,
|
||||||
@ -475,6 +519,13 @@ stats_arena_bins_print(emitter_t *emitter, bool mutex, unsigned i, uint64_t upti
|
|||||||
col_ndalloc_ps.uint64_val = rate_per_second(ndalloc, uptime);
|
col_ndalloc_ps.uint64_val = rate_per_second(ndalloc, uptime);
|
||||||
col_nrequests.uint64_val = nrequests;
|
col_nrequests.uint64_val = nrequests;
|
||||||
col_nrequests_ps.uint64_val = rate_per_second(nrequests, uptime);
|
col_nrequests_ps.uint64_val = rate_per_second(nrequests, uptime);
|
||||||
|
if (prof_stats_on) {
|
||||||
|
col_prof_live_requested.uint64_val = prof_live.req_sum;
|
||||||
|
col_prof_live_count.uint64_val = prof_live.count;
|
||||||
|
col_prof_accum_requested.uint64_val =
|
||||||
|
prof_accum.req_sum;
|
||||||
|
col_prof_accum_count.uint64_val = prof_accum.count;
|
||||||
|
}
|
||||||
col_nshards.unsigned_val = nshards;
|
col_nshards.unsigned_val = nshards;
|
||||||
col_curregs.size_val = curregs;
|
col_curregs.size_val = curregs;
|
||||||
col_curslabs.size_val = curslabs;
|
col_curslabs.size_val = curslabs;
|
||||||
@ -518,6 +569,9 @@ stats_arena_lextents_print(emitter_t *emitter, unsigned i, uint64_t uptime) {
|
|||||||
emitter_row_t row;
|
emitter_row_t row;
|
||||||
emitter_row_init(&row);
|
emitter_row_init(&row);
|
||||||
|
|
||||||
|
bool prof_stats_on = config_prof && opt_prof && opt_prof_stats
|
||||||
|
&& i == MALLCTL_ARENAS_ALL;
|
||||||
|
|
||||||
COL_HDR(row, size, NULL, right, 20, size)
|
COL_HDR(row, size, NULL, right, 20, size)
|
||||||
COL_HDR(row, ind, NULL, right, 4, unsigned)
|
COL_HDR(row, ind, NULL, right, 4, unsigned)
|
||||||
COL_HDR(row, allocated, NULL, right, 13, size)
|
COL_HDR(row, allocated, NULL, right, 13, size)
|
||||||
@ -527,6 +581,16 @@ stats_arena_lextents_print(emitter_t *emitter, unsigned i, uint64_t uptime) {
|
|||||||
COL_HDR(row, ndalloc_ps, "(#/sec)", right, 8, uint64)
|
COL_HDR(row, ndalloc_ps, "(#/sec)", right, 8, uint64)
|
||||||
COL_HDR(row, nrequests, NULL, right, 13, uint64)
|
COL_HDR(row, nrequests, NULL, right, 13, uint64)
|
||||||
COL_HDR(row, nrequests_ps, "(#/sec)", right, 8, uint64)
|
COL_HDR(row, nrequests_ps, "(#/sec)", right, 8, uint64)
|
||||||
|
COL_HDR_DECLARE(prof_live_requested)
|
||||||
|
COL_HDR_DECLARE(prof_live_count)
|
||||||
|
COL_HDR_DECLARE(prof_accum_requested)
|
||||||
|
COL_HDR_DECLARE(prof_accum_count)
|
||||||
|
if (prof_stats_on) {
|
||||||
|
COL_HDR_INIT(row, prof_live_requested, NULL, right, 21, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_live_count, NULL, right, 17, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_accum_requested, NULL, right, 21, uint64)
|
||||||
|
COL_HDR_INIT(row, prof_accum_count, NULL, right, 17, uint64)
|
||||||
|
}
|
||||||
COL_HDR(row, curlextents, NULL, right, 13, size)
|
COL_HDR(row, curlextents, NULL, right, 13, size)
|
||||||
|
|
||||||
/* As with bins, we label the large extents table. */
|
/* As with bins, we label the large extents table. */
|
||||||
@ -543,9 +607,16 @@ stats_arena_lextents_print(emitter_t *emitter, unsigned i, uint64_t uptime) {
|
|||||||
size_t arenas_lextent_mib[CTL_MAX_DEPTH];
|
size_t arenas_lextent_mib[CTL_MAX_DEPTH];
|
||||||
CTL_LEAF_PREPARE(arenas_lextent_mib, 0, "arenas.lextent");
|
CTL_LEAF_PREPARE(arenas_lextent_mib, 0, "arenas.lextent");
|
||||||
|
|
||||||
|
size_t prof_stats_mib[CTL_MAX_DEPTH];
|
||||||
|
if (prof_stats_on) {
|
||||||
|
CTL_LEAF_PREPARE(prof_stats_mib, 0, "prof.stats.lextents");
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0, in_gap = false; j < nlextents; j++) {
|
for (j = 0, in_gap = false; j < nlextents; j++) {
|
||||||
uint64_t nmalloc, ndalloc, nrequests;
|
uint64_t nmalloc, ndalloc, nrequests;
|
||||||
size_t lextent_size, curlextents;
|
size_t lextent_size, curlextents;
|
||||||
|
prof_stats_t prof_live;
|
||||||
|
prof_stats_t prof_accum;
|
||||||
|
|
||||||
stats_arenas_mib[4] = j;
|
stats_arenas_mib[4] = j;
|
||||||
arenas_lextent_mib[2] = j;
|
arenas_lextent_mib[2] = j;
|
||||||
@ -567,7 +638,25 @@ stats_arena_lextents_print(emitter_t *emitter, unsigned i, uint64_t uptime) {
|
|||||||
CTL_LEAF(stats_arenas_mib, 5, "curlextents", &curlextents,
|
CTL_LEAF(stats_arenas_mib, 5, "curlextents", &curlextents,
|
||||||
size_t);
|
size_t);
|
||||||
|
|
||||||
|
if (prof_stats_on) {
|
||||||
|
prof_stats_mib[3] = j;
|
||||||
|
CTL_LEAF(prof_stats_mib, 4, "live", &prof_live,
|
||||||
|
prof_stats_t);
|
||||||
|
CTL_LEAF(prof_stats_mib, 4, "accum", &prof_accum,
|
||||||
|
prof_stats_t);
|
||||||
|
}
|
||||||
|
|
||||||
emitter_json_object_begin(emitter);
|
emitter_json_object_begin(emitter);
|
||||||
|
if (prof_stats_on) {
|
||||||
|
emitter_json_kv(emitter, "prof_live_requested",
|
||||||
|
emitter_type_uint64, &prof_live.req_sum);
|
||||||
|
emitter_json_kv(emitter, "prof_live_count",
|
||||||
|
emitter_type_uint64, &prof_live.count);
|
||||||
|
emitter_json_kv(emitter, "prof_accum_requested",
|
||||||
|
emitter_type_uint64, &prof_accum.req_sum);
|
||||||
|
emitter_json_kv(emitter, "prof_accum_count",
|
||||||
|
emitter_type_uint64, &prof_accum.count);
|
||||||
|
}
|
||||||
emitter_json_kv(emitter, "curlextents", emitter_type_size,
|
emitter_json_kv(emitter, "curlextents", emitter_type_size,
|
||||||
&curlextents);
|
&curlextents);
|
||||||
emitter_json_object_end(emitter);
|
emitter_json_object_end(emitter);
|
||||||
@ -581,6 +670,13 @@ stats_arena_lextents_print(emitter_t *emitter, unsigned i, uint64_t uptime) {
|
|||||||
col_ndalloc_ps.uint64_val = rate_per_second(ndalloc, uptime);
|
col_ndalloc_ps.uint64_val = rate_per_second(ndalloc, uptime);
|
||||||
col_nrequests.uint64_val = nrequests;
|
col_nrequests.uint64_val = nrequests;
|
||||||
col_nrequests_ps.uint64_val = rate_per_second(nrequests, uptime);
|
col_nrequests_ps.uint64_val = rate_per_second(nrequests, uptime);
|
||||||
|
if (prof_stats_on) {
|
||||||
|
col_prof_live_requested.uint64_val = prof_live.req_sum;
|
||||||
|
col_prof_live_count.uint64_val = prof_live.count;
|
||||||
|
col_prof_accum_requested.uint64_val =
|
||||||
|
prof_accum.req_sum;
|
||||||
|
col_prof_accum_count.uint64_val = prof_accum.count;
|
||||||
|
}
|
||||||
col_curlextents.size_val = curlextents;
|
col_curlextents.size_val = curlextents;
|
||||||
|
|
||||||
if (!in_gap) {
|
if (!in_gap) {
|
||||||
|
Loading…
Reference in New Issue
Block a user