/*@null@*/ static void do_slabs_stats(struct default_engine *engine, ADD_STAT add_stats, const void *cookie) { int i, total; /* Get the per-thread stats which contain some interesting aggregates */ #ifdef FUTURE struct conn *conn = (struct conn*)cookie; struct thread_stats thread_stats; threadlocal_stats_aggregate(c, &thread_stats); #endif /* small memory classes */ add_statistics(cookie, add_stats, "SM", -1, "used_num_classes", "%d", sm_anchor.used_num_classes); add_statistics(cookie, add_stats, "SM", -1, "free_num_classes", "%d", sm_anchor.free_num_classes); add_statistics(cookie, add_stats, "SM", -1, "used_min_classid", "%d", sm_anchor.used_minid); add_statistics(cookie, add_stats, "SM", -1, "used_max_classid", "%d", sm_anchor.used_maxid); add_statistics(cookie, add_stats, "SM", -1, "free_min_classid", "%d", sm_anchor.free_minid); add_statistics(cookie, add_stats, "SM", -1, "free_max_classid", "%d", sm_anchor.free_maxid); add_statistics(cookie, add_stats, "SM", -1, "free_big_slot_count", "%"PRIu64, sm_anchor.free_slist[SMMGR_NUM_CLASSES-1].count); add_statistics(cookie, add_stats, "SM", -1, "used_total_space", "%"PRIu64, sm_anchor.used_total_space); add_statistics(cookie, add_stats, "SM", -1, "free_small_space", "%"PRIu64, sm_anchor.free_small_space); add_statistics(cookie, add_stats, "SM", -1, "free_avail_space", "%"PRIu64, sm_anchor.free_avail_space); add_statistics(cookie, add_stats, "SM", -1, "free_chunk_space", "%"PRIu64, sm_anchor.free_chunk_space); add_statistics(cookie, add_stats, "SM", -1, "free_limit_space", "%"PRIu64, sm_anchor.free_limit_space); add_statistics(cookie, add_stats, "SM", -1, "space_shortage_level", "%d", sm_anchor.space_shortage_level); total = 0; int min_slab_id = POWER_SMALLEST; min_slab_id = sm_anchor.blck_clsid; for (i = min_slab_id; i <= engine->slabs.power_largest; i++) { slabclass_t *p = &engine->slabs.slabclass[i]; if (p->slabs != 0) { uint32_t perslab, slabs; slabs = p->slabs; perslab = p->perslab; add_statistics(cookie, add_stats, NULL, i, "chunk_size", "%u", p->size); add_statistics(cookie, add_stats, NULL, i, "chunks_per_page", "%u", perslab); add_statistics(cookie, add_stats, NULL, i, "reserved_pages", "%u", p->rsvd_slabs); add_statistics(cookie, add_stats, NULL, i, "total_pages", "%u", slabs); add_statistics(cookie, add_stats, NULL, i, "total_chunks", "%u", slabs*perslab); add_statistics(cookie, add_stats, NULL, i, "used_chunks", "%u", (slabs*perslab)-p->sl_curr-p->end_page_free); add_statistics(cookie, add_stats, NULL, i, "free_chunks", "%u", p->sl_curr); add_statistics(cookie, add_stats, NULL, i, "free_chunks_end", "%u", p->end_page_free); add_statistics(cookie, add_stats, NULL, i, "mem_requested", "%zu", p->requested); #ifdef FUTURE add_statistics(cookie, add_stats, NULL, i, "get_hits", "%"PRIu64, thread_stats.slab_stats[i].get_hits); add_statistics(cookie, add_stats, NULL, i, "cmd_set", "%"PRIu64, thread_stats.slab_stats[i].set_cmds); add_statistics(cookie, add_stats, NULL, i, "delete_hits", "%"PRIu64, thread_stats.slab_stats[i].delete_hits); add_statistics(cookie, add_stats, NULL, i, "cas_hits", "%"PRIu64, thread_stats.slab_stats[i].cas_hits); add_statistics(cookie, add_stats, NULL, i, "cas_badval", "%"PRIu64, thread_stats.slab_stats[i].cas_badval); #endif total++; } } /* add overall slab stats and append terminator */ add_statistics(cookie, add_stats, NULL, -1, "active_slabs", "%d", total); add_statistics(cookie, add_stats, NULL, -1, "memory_limit", "%zu", engine->slabs.mem_limit); add_statistics(cookie, add_stats, NULL, -1, "total_malloced", "%zu", engine->slabs.mem_malloced); }
/*@null@*/ static void do_slabs_stats(ADD_STAT add_stats, void *c) { int i, total; /* Get the per-thread stats which contain some interesting aggregates */ struct thread_stats thread_stats; threadlocal_stats_aggregate(&thread_stats); total = 0; for(i = POWER_SMALLEST; i <= power_largest; i++) { slabclass_t *p = &slabclass[i]; if (p->slabs != 0) { uint32_t perslab, slabs; slabs = p->slabs; perslab = p->perslab; char key_str[STAT_KEY_LEN]; char val_str[STAT_VAL_LEN]; int klen = 0, vlen = 0; APPEND_NUM_STAT(i, "chunk_size", "%u", p->size); APPEND_NUM_STAT(i, "chunks_per_page", "%u", perslab); APPEND_NUM_STAT(i, "total_pages", "%u", slabs); APPEND_NUM_STAT(i, "total_chunks", "%u", slabs * perslab); APPEND_NUM_STAT(i, "used_chunks", "%u", slabs*perslab - p->sl_curr); APPEND_NUM_STAT(i, "free_chunks", "%u", p->sl_curr); /* Stat is dead, but displaying zero instead of removing it. */ APPEND_NUM_STAT(i, "free_chunks_end", "%u", 0); APPEND_NUM_STAT(i, "mem_requested", "%llu", (unsigned long long)p->requested); APPEND_NUM_STAT(i, "get_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].get_hits); APPEND_NUM_STAT(i, "cmd_set", "%llu", (unsigned long long)thread_stats.slab_stats[i].set_cmds); APPEND_NUM_STAT(i, "delete_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].delete_hits); APPEND_NUM_STAT(i, "incr_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].incr_hits); APPEND_NUM_STAT(i, "decr_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].decr_hits); APPEND_NUM_STAT(i, "cas_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].cas_hits); APPEND_NUM_STAT(i, "cas_badval", "%llu", (unsigned long long)thread_stats.slab_stats[i].cas_badval); APPEND_NUM_STAT(i, "touch_hits", "%llu", (unsigned long long)thread_stats.slab_stats[i].touch_hits); total++; } } /* add overall slab stats and append terminator */ APPEND_STAT("active_slabs", "%d", total); APPEND_STAT("total_malloced", "%llu", (unsigned long long)mem_malloced); add_stats(NULL, 0, NULL, 0, c); }
/*@null@*/ static void do_slabs_stats(struct default_engine *engine, ADD_STAT add_stats, const void *cookie) { unsigned int i, total; /* Get the per-thread stats which contain some interesting aggregates */ #ifdef FUTURE struct conn *conn = (struct conn*)cookie; struct thread_stats thread_stats; threadlocal_stats_aggregate(c, &thread_stats); #endif total = 0; for(i = POWER_SMALLEST; i <= engine->slabs.power_largest; i++) { slabclass_t *p = &engine->slabs.slabclass[i]; if (p->slabs != 0) { uint32_t perslab, slabs; slabs = p->slabs; perslab = p->perslab; add_statistics(cookie, add_stats, NULL, i, "chunk_size", "%u", p->size); add_statistics(cookie, add_stats, NULL, i, "chunks_per_page", "%u", perslab); add_statistics(cookie, add_stats, NULL, i, "total_pages", "%u", slabs); add_statistics(cookie, add_stats, NULL, i, "total_chunks", "%u", slabs * perslab); add_statistics(cookie, add_stats, NULL, i, "used_chunks", "%u", slabs*perslab - p->sl_curr - p->end_page_free); add_statistics(cookie, add_stats, NULL, i, "free_chunks", "%u", p->sl_curr); add_statistics(cookie, add_stats, NULL, i, "free_chunks_end", "%u", p->end_page_free); add_statistics(cookie, add_stats, NULL, i, "mem_requested", "%"PRIu64, (uint64_t)p->requested); #ifdef FUTURE add_statistics(cookie, add_stats, NULL, i, "get_hits", "%"PRIu64, thread_stats.slab_stats[i].get_hits); add_statistics(cookie, add_stats, NULL, i, "cmd_set", "%"PRIu64, thread_stats.slab_stats[i].set_cmds); add_statistics(cookie, add_stats, NULL, i, "delete_hits", "%"PRIu64, thread_stats.slab_stats[i].delete_hits); add_statistics(cookie, add_stats, NULL, i, "cas_hits", "%"PRIu64, thread_stats.slab_stats[i].cas_hits); add_statistics(cookie, add_stats, NULL, i, "cas_badval", "%"PRIu64, thread_stats.slab_stats[i].cas_badval); #endif total++; } } /* add overall slab stats and append terminator */ add_statistics(cookie, add_stats, NULL, -1, "active_slabs", "%d", total); add_statistics(cookie, add_stats, NULL, -1, "total_malloced", "%"PRIu64, (uint64_t)engine->slabs.mem_malloced); }