Derive {allocated,nmalloc,ndalloc,nrequests}_large stats.

This mildly reduces stats update overhead during normal operation.
This commit is contained in:
Jason Evans 2017-02-13 09:44:46 -08:00
parent ab25d3c987
commit d433471f58
2 changed files with 27 additions and 26 deletions

View File

@ -104,10 +104,10 @@ struct arena_stats_s {
size_t internal; size_t internal;
size_t resident; /* Derived. */ size_t resident; /* Derived. */
size_t allocated_large; size_t allocated_large; /* Derived. */
uint64_t nmalloc_large; uint64_t nmalloc_large; /* Derived. */
uint64_t ndalloc_large; uint64_t ndalloc_large; /* Derived. */
uint64_t nrequests_large; uint64_t nrequests_large; /* Derived. */
/* Number of bytes cached in tcache associated with this arena. */ /* Number of bytes cached in tcache associated with this arena. */
size_t tcache_bytes; /* Derived. */ size_t tcache_bytes; /* Derived. */

View File

@ -136,8 +136,6 @@ void
arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats, arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats,
szind_t szind, uint64_t nrequests) { szind_t szind, uint64_t nrequests) {
arena_stats_lock(tsdn, arena_stats); arena_stats_lock(tsdn, arena_stats);
arena_stats_add_u64(tsdn, arena_stats, &arena_stats->nrequests_large,
nrequests);
arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind - arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind -
NBINS].nrequests, nrequests); NBINS].nrequests, nrequests);
arena_stats_unlock(tsdn, arena_stats); arena_stats_unlock(tsdn, arena_stats);
@ -160,14 +158,12 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
const char **dss, ssize_t *decay_time, size_t *nactive, size_t *ndirty, const char **dss, ssize_t *decay_time, size_t *nactive, size_t *ndirty,
arena_stats_t *astats, malloc_bin_stats_t *bstats, arena_stats_t *astats, malloc_bin_stats_t *bstats,
malloc_large_stats_t *lstats) { malloc_large_stats_t *lstats) {
size_t base_allocated, base_resident, base_mapped;
unsigned i;
cassert(config_stats); cassert(config_stats);
arena_basic_stats_merge(tsdn, arena, nthreads, dss, decay_time, arena_basic_stats_merge(tsdn, arena, nthreads, dss, decay_time,
nactive, ndirty); nactive, ndirty);
size_t base_allocated, base_resident, base_mapped;
base_stats_get(tsdn, arena->base, &base_allocated, &base_resident, base_stats_get(tsdn, arena->base, &base_allocated, &base_resident,
&base_mapped); &base_mapped);
@ -196,15 +192,30 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
astats->nrequests_large += arena_stats_read_u64(tsdn, &arena->stats, astats->nrequests_large += arena_stats_read_u64(tsdn, &arena->stats,
&arena->stats.nrequests_large); &arena->stats.nrequests_large);
for (i = 0; i < NSIZES - NBINS; i++) { astats->allocated_large = 0;
lstats[i].nmalloc += arena_stats_read_u64(tsdn, &arena->stats, astats->nmalloc_large = 0;
astats->ndalloc_large = 0;
astats->nrequests_large = 0;
for (szind_t i = 0; i < NSIZES - NBINS; i++) {
uint64_t nmalloc = arena_stats_read_u64(tsdn, &arena->stats,
&arena->stats.lstats[i].nmalloc); &arena->stats.lstats[i].nmalloc);
lstats[i].ndalloc += arena_stats_read_u64(tsdn, &arena->stats, lstats[i].nmalloc += nmalloc;
astats->nmalloc_large += nmalloc;
uint64_t ndalloc = arena_stats_read_u64(tsdn, &arena->stats,
&arena->stats.lstats[i].ndalloc); &arena->stats.lstats[i].ndalloc);
lstats[i].nrequests += arena_stats_read_u64(tsdn, &arena->stats, lstats[i].ndalloc += ndalloc;
astats->ndalloc_large += ndalloc;
uint64_t nrequests = arena_stats_read_u64(tsdn, &arena->stats,
&arena->stats.lstats[i].nrequests); &arena->stats.lstats[i].nrequests);
lstats[i].curlextents += arena_stats_read_zu(tsdn, lstats[i].nrequests += nrequests;
astats->nrequests_large += nrequests;
size_t curlextents = arena_stats_read_zu(tsdn,
&arena->stats, &arena->stats.lstats[i].curlextents); &arena->stats, &arena->stats.lstats[i].curlextents);
lstats[i].curlextents += curlextents;
astats->allocated_large += curlextents * index2size(i);
} }
arena_stats_unlock(tsdn, &arena->stats); arena_stats_unlock(tsdn, &arena->stats);
@ -217,7 +228,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
astats->tcache_bytes = 0; astats->tcache_bytes = 0;
malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx); malloc_mutex_lock(tsdn, &arena->tcache_ql_mtx);
ql_foreach(tcache, &arena->tcache_ql, link) { ql_foreach(tcache, &arena->tcache_ql, link) {
for (i = 0; i < nhbins; i++) { for (szind_t i = 0; i < nhbins; i++) {
tbin = &tcache->tbins[i]; tbin = &tcache->tbins[i];
astats->tcache_bytes += tbin->ncached * astats->tcache_bytes += tbin->ncached *
index2size(i); index2size(i);
@ -226,7 +237,7 @@ arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx); malloc_mutex_unlock(tsdn, &arena->tcache_ql_mtx);
} }
for (i = 0; i < NBINS; i++) { for (szind_t i = 0; i < NBINS; i++) {
arena_bin_t *bin = &arena->bins[i]; arena_bin_t *bin = &arena->bins[i];
malloc_mutex_lock(tsdn, &bin->lock); malloc_mutex_lock(tsdn, &bin->lock);
@ -347,10 +358,6 @@ arena_large_malloc_stats_update(tsdn_t *tsdn, arena_t *arena, size_t usize) {
index = size2index(usize); index = size2index(usize);
hindex = (index >= NBINS) ? index - NBINS : 0; hindex = (index >= NBINS) ? index - NBINS : 0;
arena_stats_add_u64(tsdn, &arena->stats, &arena->stats.nmalloc_large,
1);
arena_stats_add_zu(tsdn, &arena->stats, &arena->stats.allocated_large,
usize);
arena_stats_add_u64(tsdn, &arena->stats, arena_stats_add_u64(tsdn, &arena->stats,
&arena->stats.lstats[hindex].nmalloc, 1); &arena->stats.lstats[hindex].nmalloc, 1);
arena_stats_add_u64(tsdn, &arena->stats, arena_stats_add_u64(tsdn, &arena->stats,
@ -371,10 +378,6 @@ arena_large_dalloc_stats_update(tsdn_t *tsdn, arena_t *arena, size_t usize) {
index = size2index(usize); index = size2index(usize);
hindex = (index >= NBINS) ? index - NBINS : 0; hindex = (index >= NBINS) ? index - NBINS : 0;
arena_stats_add_u64(tsdn, &arena->stats, &arena->stats.ndalloc_large,
1);
arena_stats_sub_zu(tsdn, &arena->stats, &arena->stats.allocated_large,
usize);
arena_stats_add_u64(tsdn, &arena->stats, arena_stats_add_u64(tsdn, &arena->stats,
&arena->stats.lstats[hindex].ndalloc, 1); &arena->stats.lstats[hindex].ndalloc, 1);
arena_stats_sub_zu(tsdn, &arena->stats, arena_stats_sub_zu(tsdn, &arena->stats,
@ -389,8 +392,6 @@ arena_large_reset_stats_cancel(tsdn_t *tsdn, arena_t *arena, size_t usize) {
cassert(config_stats); cassert(config_stats);
arena_stats_lock(tsdn, &arena->stats); arena_stats_lock(tsdn, &arena->stats);
arena_stats_sub_u64(tsdn, &arena->stats, &arena->stats.ndalloc_large,
1);
arena_stats_sub_u64(tsdn, &arena->stats, arena_stats_sub_u64(tsdn, &arena->stats,
&arena->stats.lstats[hindex].ndalloc, 1); &arena->stats.lstats[hindex].ndalloc, 1);
arena_stats_unlock(tsdn, &arena->stats); arena_stats_unlock(tsdn, &arena->stats);