mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-04-14 14:41:42 +03:00
Bin batching: add some stats.
This lets us easily see what fraction of flush load is being taken up by the bins, and helps guide future optimization approaches (for example: should we prefetch during cache bin fills? It depends on how many objects the average fill pops out of the batch).
This commit is contained in:
parent
fc615739cb
commit
f9c0b5f7f8
8 changed files with 114 additions and 0 deletions
|
|
@ -630,6 +630,8 @@ arena_bin_flush_batch_impl(tsdn_t *tsdn, arena_t *arena, bin_t *bin,
|
|||
&batched_bin->remote_frees.mtx);
|
||||
}
|
||||
|
||||
size_t npushes = batcher_pop_get_pushes(tsdn,
|
||||
&batched_bin->remote_frees);
|
||||
bin_remote_free_data_t remote_free_data[BIN_REMOTE_FREE_ELEMS_MAX];
|
||||
for (size_t i = 0; i < nelems_to_pop; i++) {
|
||||
remote_free_data[i] = batched_bin->remote_free_data[i];
|
||||
|
|
@ -642,6 +644,10 @@ arena_bin_flush_batch_impl(tsdn_t *tsdn, arena_t *arena, bin_t *bin,
|
|||
dalloc_slabs, ndalloc_slabs, dalloc_count,
|
||||
dalloc_slabs_extra);
|
||||
}
|
||||
|
||||
bin->stats.batch_pops++;
|
||||
bin->stats.batch_pushes += npushes;
|
||||
bin->stats.batch_pushed_elems += nelems_to_pop;
|
||||
}
|
||||
|
||||
typedef struct arena_bin_flush_batch_state_s arena_bin_flush_batch_state_t;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ struct batcher_s {
|
|||
*/
|
||||
atomic_zu_t nelems;
|
||||
size_t nelems_max;
|
||||
size_t npushes;
|
||||
malloc_mutex_t mtx;
|
||||
};
|
||||
|
||||
|
|
@ -35,6 +36,7 @@ void batcher_push_end(tsdn_t *tsdn, batcher_t *batcher);
|
|||
* If the former, must be followed by a call to batcher_pop_end.
|
||||
*/
|
||||
size_t batcher_pop_begin(tsdn_t *tsdn, batcher_t *batcher);
|
||||
size_t batcher_pop_get_pushes(tsdn_t *tsdn, batcher_t *batcher);
|
||||
void batcher_pop_end(tsdn_t *tsdn, batcher_t *batcher);
|
||||
|
||||
void batcher_prefork(tsdn_t *tsdn, batcher_t *batcher);
|
||||
|
|
|
|||
|
|
@ -138,6 +138,11 @@ bin_stats_merge(tsdn_t *tsdn, bin_stats_data_t *dst_bin_stats, bin_t *bin) {
|
|||
stats->reslabs += bin->stats.reslabs;
|
||||
stats->curslabs += bin->stats.curslabs;
|
||||
stats->nonfull_slabs += bin->stats.nonfull_slabs;
|
||||
|
||||
stats->batch_failed_pushes += bin->stats.batch_failed_pushes;
|
||||
stats->batch_pushes += bin->stats.batch_pushes;
|
||||
stats->batch_pushed_elems += bin->stats.batch_pushed_elems;
|
||||
|
||||
malloc_mutex_unlock(tsdn, &bin->lock);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,6 +48,11 @@ struct bin_stats_s {
|
|||
|
||||
/* Current size of nonfull slabs heap in this bin. */
|
||||
size_t nonfull_slabs;
|
||||
|
||||
uint64_t batch_pops;
|
||||
uint64_t batch_failed_pushes;
|
||||
uint64_t batch_pushes;
|
||||
uint64_t batch_pushed_elems;
|
||||
};
|
||||
|
||||
typedef struct bin_stats_data_s bin_stats_data_t;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue