bool get_stats(const char *stat_type, int nkey, ADD_STAT add_stats, void *c) { bool ret = true; if (add_stats != NULL) { if (!stat_type) { /* prepare general statistics for the engine */ STATS_LOCK(); APPEND_STAT("bytes", "%llu", (unsigned long long)stats.curr_bytes); APPEND_STAT("curr_items", "%u", stats.curr_items); APPEND_STAT("total_items", "%u", stats.total_items); APPEND_STAT("evictions", "%llu", (unsigned long long)stats.evictions); APPEND_STAT("reclaimed", "%llu", (unsigned long long)stats.reclaimed); STATS_UNLOCK(); } else if (nz_strcmp(nkey, stat_type, "items") == 0) { item_stats(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "slabs") == 0) { slabs_stats(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "sizes") == 0) { item_stats_sizes(add_stats, c); } else { ret = false; } } else { ret = false; } return ret; }
bool get_stats(const char *stat_type, int nkey, ADD_STAT add_stats, void *c) { bool ret = true; if (add_stats != NULL) { if (!stat_type) { /* prepare general statistics for the engine */ STATS_LOCK(); APPEND_STAT("bytes", "%llu", (unsigned long long)stats_state.curr_bytes); APPEND_STAT("curr_items", "%llu", (unsigned long long)stats_state.curr_items); APPEND_STAT("total_items", "%llu", (unsigned long long)stats.total_items); STATS_UNLOCK(); if (settings.slab_automove > 0) { pthread_mutex_lock(&slabs_lock); APPEND_STAT("slab_global_page_pool", "%u", slabclass[SLAB_GLOBAL_PAGE_POOL].slabs); pthread_mutex_unlock(&slabs_lock); } item_stats_totals(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "items") == 0) { item_stats(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "slabs") == 0) { slabs_stats(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "sizes") == 0) { item_stats_sizes(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "sizes_enable") == 0) { item_stats_sizes_enable(add_stats, c); } else if (nz_strcmp(nkey, stat_type, "sizes_disable") == 0) { item_stats_sizes_disable(add_stats, c); } else { ret = false; } } else { ret = false; } return ret; }
void process_stat(conn *c, char *command) { time_t now = time(0); if (strcmp(command, "stats") == 0) { char temp[1024]; pid_t pid = getpid(); char *pos = temp; struct rusage usage; getrusage(RUSAGE_SELF, &usage); pos += sprintf(pos, "STAT pid %u\r\n", pid); pos += sprintf(pos, "STAT uptime %lu\r\n", now - stats.started); pos += sprintf(pos, "STAT time %ld\r\n", now); pos += sprintf(pos, "STAT version " VERSION "\r\n"); pos += sprintf(pos, "STAT rusage_user %ld.%06ld\r\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec); pos += sprintf(pos, "STAT rusage_system %ld.%06ld\r\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); pos += sprintf(pos, "STAT curr_items %u\r\n", stats.curr_items); pos += sprintf(pos, "STAT total_items %u\r\n", stats.total_items); pos += sprintf(pos, "STAT bytes %llu\r\n", stats.curr_bytes); pos += sprintf(pos, "STAT curr_connections %u\r\n", stats.curr_conns - 1); /* ignore listening conn */ pos += sprintf(pos, "STAT total_connections %u\r\n", stats.total_conns); pos += sprintf(pos, "STAT connection_structures %u\r\n", stats.conn_structs); pos += sprintf(pos, "STAT cmd_get %u\r\n", stats.get_cmds); pos += sprintf(pos, "STAT cmd_set %u\r\n", stats.set_cmds); pos += sprintf(pos, "STAT get_hits %u\r\n", stats.get_hits); pos += sprintf(pos, "STAT get_misses %u\r\n", stats.get_misses); pos += sprintf(pos, "STAT bytes_read %llu\r\n", stats.bytes_read); pos += sprintf(pos, "STAT bytes_written %llu\r\n", stats.bytes_written); pos += sprintf(pos, "STAT limit_maxbytes %u\r\n", settings.maxbytes); pos += sprintf(pos, "END"); out_string(c, temp); return; } if (strcmp(command, "stats reset") == 0) { stats_reset(); out_string(c, "RESET"); return; } #ifdef HAVE_MALLOC_H #ifdef HAVE_STRUCT_MALLINFO if (strcmp(command, "stats malloc") == 0) { char temp[512]; struct mallinfo info; char *pos = temp; info = mallinfo(); pos += sprintf(pos, "STAT arena_size %d\r\n", info.arena); pos += sprintf(pos, "STAT free_chunks %d\r\n", info.ordblks); pos += sprintf(pos, "STAT fastbin_blocks %d\r\n", info.smblks); pos += sprintf(pos, "STAT mmapped_regions %d\r\n", info.hblks); pos += sprintf(pos, "STAT mmapped_space %d\r\n", info.hblkhd); pos += sprintf(pos, "STAT max_total_alloc %d\r\n", info.usmblks); pos += sprintf(pos, "STAT fastbin_space %d\r\n", info.fsmblks); pos += sprintf(pos, "STAT total_alloc %d\r\n", info.uordblks); pos += sprintf(pos, "STAT total_free %d\r\n", info.fordblks); pos += sprintf(pos, "STAT releasable_space %d\r\nEND", info.keepcost); out_string(c, temp); return; } #endif /* HAVE_STRUCT_MALLINFO */ #endif /* HAVE_MALLOC_H */ if (strcmp(command, "stats maps") == 0) { char *wbuf; int wsize = 8192; /* should be enough */ int fd; int res; wbuf = (char *)malloc(wsize); if (wbuf == 0) { out_string(c, "SERVER_ERROR out of memory"); return; } fd = open("/proc/self/maps", O_RDONLY); if (fd == -1) { out_string(c, "SERVER_ERROR cannot open the maps file"); free(wbuf); return; } res = read(fd, wbuf, wsize - 6); /* 6 = END\r\n\0 */ if (res == wsize - 6) { out_string(c, "SERVER_ERROR buffer overflow"); free(wbuf); close(fd); return; } if (res == 0 || res == -1) { out_string(c, "SERVER_ERROR can't read the maps file"); free(wbuf); close(fd); return; } strcpy(wbuf + res, "END\r\n"); c->write_and_free=wbuf; c->wcurr=wbuf; c->wbytes = res + 6; c->state = conn_write; c->write_and_go = conn_read; close(fd); return; } if (strncmp(command, "stats cachedump", 15) == 0) { char *buf; unsigned int bytes, id, limit = 0; char *start = command + 15; if (sscanf(start, "%u %u\r\n", &id, &limit) < 1) { out_string(c, "CLIENT_ERROR bad command line"); return; } buf = item_cachedump(id, limit, &bytes); if (buf == 0) { out_string(c, "SERVER_ERROR out of memory"); return; } c->write_and_free = buf; c->wcurr = buf; c->wbytes = bytes; c->state = conn_write; c->write_and_go = conn_read; return; } if (strcmp(command, "stats slabs")==0) { int bytes = 0; char *buf = slabs_stats(&bytes); if (!buf) { out_string(c, "SERVER_ERROR out of memory"); return; } c->write_and_free = buf; c->wcurr = buf; c->wbytes = bytes; c->state = conn_write; c->write_and_go = conn_read; return; } if (strcmp(command, "stats items")==0) { char buffer[4096]; item_stats(buffer, 4096); out_string(c, buffer); return; } if (strcmp(command, "stats sizes")==0) { int bytes = 0; char *buf = item_stats_sizes(&bytes); if (! buf) { out_string(c, "SERVER_ERROR out of memory"); return; } c->write_and_free = buf; c->wcurr = buf; c->wbytes = bytes; c->state = conn_write; c->write_and_go = conn_read; return; } out_string(c, "ERROR"); }