X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fmemstat.c;h=0bc365ac8010eabbe6491eb5174cad66e8d5cda3;hb=c79b88bc75d37c933e9d05c83113ccb26ded3683;hp=e6783b68c095c7a8de4b2f88309a2ce5f53aceed;hpb=f0c2cbb3c6cb62fae50fefe373e50590a6bd50c3;p=m6w6%2Flibmemcached diff --git a/clients/memstat.c b/clients/memstat.c index e6783b68..0bc365ac 100644 --- a/clients/memstat.c +++ b/clients/memstat.c @@ -1,9 +1,22 @@ -#include "libmemcached/common.h" +/* LibMemcached + * Copyright (C) 2006-2009 Brian Aker + * All rights reserved. + * + * Use and distribution licensed under the BSD license. See + * the COPYING file in the parent directory for full text. + * + * Summary: + * + * Authors: + * Brian Aker + * Toru Maesaka + */ +#include "config.h" + #include #include #include #include -#include #include #include #include @@ -19,13 +32,9 @@ /* Prototypes */ static void options_parse(int argc, char *argv[]); -static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, - memcached_server_st *server_list); -static void print_server_listing(memcached_st *memc, memcached_stat_st *memc_stat, - memcached_server_st *server_list); +static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat); static void print_analysis_report(memcached_st *memc, - memcached_analysis_st *report, - memcached_server_st *server_list); + memcached_analysis_st *report); static int opt_verbose= 0; static int opt_displayflag= 0; @@ -45,17 +54,37 @@ static struct option long_options[]= {0, 0, 0, 0}, }; + +static memcached_return_t stat_printer(memcached_server_instance_st instance, + const char *key, size_t key_length, + const char *value, size_t value_length, + void *context) +{ + static memcached_server_instance_st last= NULL; + (void)context; + + if (last != instance) + { + printf("Server: %s (%u)\n", memcached_server_name(instance), + (uint32_t)memcached_server_port(instance)); + last= instance; + } + + printf("\t %.*s: %.*s\n", (int)key_length, key, (int)value_length, value); + + return MEMCACHED_SUCCESS; +} + int main(int argc, char *argv[]) { - memcached_return rc; + memcached_return_t rc; memcached_st *memc; - memcached_stat_st *memc_stat; memcached_server_st *servers; - memcached_server_st *server_list; options_parse(argc, argv); + initialize_sockets(); - if (!opt_servers) + if (! opt_servers) { char *temp; @@ -72,11 +101,9 @@ int main(int argc, char *argv[]) memc= memcached_create(NULL); servers= memcached_servers_parse(opt_servers); - memcached_server_push(memc, servers); + rc= memcached_server_push(memc, servers); memcached_server_list_free(servers); - memc_stat= memcached_stat(memc, NULL, &rc); - if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_SOME_ERRORS) { printf("Failure to communicate with servers (%s)\n", @@ -84,25 +111,34 @@ int main(int argc, char *argv[]) exit(1); } - server_list= memcached_server_list(memc); - if (opt_analyze) - run_analyzer(memc, memc_stat, server_list); + { + memcached_stat_st *memc_stat; + + memc_stat= memcached_stat(memc, NULL, &rc); + + if (! memc_stat) + exit(-1); + + run_analyzer(memc, memc_stat); + + memcached_stat_free(memc, memc_stat); + } else - print_server_listing(memc, memc_stat, server_list); + { + rc= memcached_stat_execute(memc, NULL, stat_printer, NULL); + } - free(memc_stat); free(opt_servers); memcached_free(memc); - return 0; + return rc == MEMCACHED_SUCCESS ? 0: -1; } -static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, - memcached_server_st *server_list) +static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat) { - memcached_return rc; + memcached_return_t rc; if (analyze_mode == NULL) { @@ -114,13 +150,13 @@ static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, memcached_strerror(memc, rc)); exit(1); } - print_analysis_report(memc, report, server_list); + print_analysis_report(memc, report); free(report); } else if (strcmp(analyze_mode, "latency") == 0) { memcached_st **servers; - uint32_t x, y, flags, server_count= memcached_server_count(memc); + uint32_t flags, server_count= memcached_server_count(memc); uint32_t num_of_tests= 32; const char *test_key= "libmemcached_test_key"; @@ -131,9 +167,12 @@ static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, return; } - for (x= 0; x < server_count; x++) + for (uint32_t x= 0; x < server_count; x++) { - if((servers[x]= memcached_create(NULL)) == NULL) + memcached_server_instance_st instance= + memcached_server_instance_by_position(memc, x); + + if ((servers[x]= memcached_create(NULL)) == NULL) { fprintf(stderr, "Failed to memcached_create()\n"); if (x > 0) @@ -146,18 +185,22 @@ static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, return; } memcached_server_add(servers[x], - memcached_server_name(memc, server_list[x]), - memcached_server_port(memc, server_list[x])); + memcached_server_name(instance), + memcached_server_port(instance)); } printf("Network Latency Test:\n\n"); struct timeval start_time, end_time; - long elapsed_time, slowest_time= 0, slowest_server= 0; + uint32_t slowest_server= 0; + long elapsed_time, slowest_time= 0; - for (x= 0; x < server_count; x++) + for (uint32_t x= 0; x < server_count; x++) { + memcached_server_instance_st instance= + memcached_server_instance_by_position(memc, x); gettimeofday(&start_time, NULL); - for (y= 0; y < num_of_tests; y++) + + for (uint32_t y= 0; y < num_of_tests; y++) { size_t vlen; char *val= memcached_get(servers[x], test_key, strlen(test_key), @@ -168,41 +211,44 @@ static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, } gettimeofday(&end_time, NULL); - elapsed_time= timedif(end_time, start_time); - elapsed_time /= (long)num_of_tests; + elapsed_time= (long) timedif(end_time, start_time); + elapsed_time /= (long) num_of_tests; if (elapsed_time > slowest_time) { - slowest_server= (long)x; + slowest_server= x; slowest_time= elapsed_time; } if (rc != MEMCACHED_NOTFOUND && rc != MEMCACHED_SUCCESS) { printf("\t %s (%d) => failed to reach the server\n", - memcached_server_name(memc, server_list[x]), - memcached_server_port(memc, server_list[x])); + memcached_server_name(instance), + memcached_server_port(instance)); } else { printf("\t %s (%d) => %ld.%ld seconds\n", - memcached_server_name(memc, server_list[x]), - memcached_server_port(memc, server_list[x]), + memcached_server_name(instance), + memcached_server_port(instance), elapsed_time / 1000, elapsed_time % 1000); } } if (server_count > 1 && slowest_time > 0) { + memcached_server_instance_st slowest= + memcached_server_instance_by_position(memc, slowest_server); + printf("---\n"); printf("Slowest Server: %s (%d) => %ld.%ld seconds\n", - memcached_server_name(memc, server_list[slowest_server]), - memcached_server_port(memc, server_list[slowest_server]), + memcached_server_name(slowest), + memcached_server_port(slowest), slowest_time / 1000, slowest_time % 1000); } printf("\n"); - for (x= 0; x < server_count; x++) + for (uint32_t x= 0; x < server_count; x++) memcached_free(servers[x]); free(servers); @@ -215,44 +261,18 @@ static void run_analyzer(memcached_st *memc, memcached_stat_st *memc_stat, } } -static void print_server_listing(memcached_st *memc, memcached_stat_st *memc_stat, - memcached_server_st *server_list) -{ - unsigned int x; - memcached_return rc; - - printf("Listing %u Server\n\n", memcached_server_count(memc)); - for (x= 0; x < memcached_server_count(memc); x++) - { - char **list; - char **ptr; - - list= memcached_stat_get_keys(memc, &memc_stat[x], &rc); - - printf("Server: %s (%u)\n", memcached_server_name(memc, server_list[x]), - memcached_server_port(memc, server_list[x])); - for (ptr= list; *ptr; ptr++) - { - char *value= memcached_stat_get_value(memc, &memc_stat[x], *ptr, &rc); - - printf("\t %s: %s\n", *ptr, value); - free(value); - } - - free(list); - printf("\n"); - } -} - static void print_analysis_report(memcached_st *memc, - memcached_analysis_st *report, - memcached_server_st *server_list) + memcached_analysis_st *report) + { uint32_t server_count= memcached_server_count(memc); + memcached_server_instance_st most_consumed_server= memcached_server_instance_by_position(memc, report->most_consumed_server); + memcached_server_instance_st least_free_server= memcached_server_instance_by_position(memc, report->least_free_server); + memcached_server_instance_st oldest_server= memcached_server_instance_by_position(memc, report->oldest_server); printf("Memcached Cluster Analysis Report\n\n"); - printf("\tNumber of Servers Analyzed : %d\n", server_count); + printf("\tNumber of Servers Analyzed : %u\n", server_count); printf("\tAverage Item Size (incl/overhead) : %u bytes\n", report->average_item_size); @@ -264,16 +284,16 @@ static void print_analysis_report(memcached_st *memc, printf("\n"); printf("\tNode with most memory consumption : %s:%u (%llu bytes)\n", - memcached_server_name(memc, server_list[report->most_consumed_server]), - memcached_server_port(memc, server_list[report->most_consumed_server]), + memcached_server_name(most_consumed_server), + (uint32_t)memcached_server_port(most_consumed_server), (unsigned long long)report->most_used_bytes); printf("\tNode with least free space : %s:%u (%llu bytes remaining)\n", - memcached_server_name(memc, server_list[report->least_free_server]), - memcached_server_port(memc, server_list[report->least_free_server]), + memcached_server_name(least_free_server), + (uint32_t)memcached_server_port(least_free_server), (unsigned long long)report->least_remaining_bytes); printf("\tNode with longest uptime : %s:%u (%us)\n", - memcached_server_name(memc, server_list[report->oldest_server]), - memcached_server_port(memc, server_list[report->oldest_server]), + memcached_server_name(oldest_server), + (uint32_t)memcached_server_port(oldest_server), report->longest_uptime); printf("\tPool-wide Hit Ratio : %1.f%%\n", report->pool_hit_ratio); printf("\n");