X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fmemstat.c;h=a04327e64e947de63abe1b951455fda2f4ee15b4;hb=f351ea037148e992ef5a6ea66d355dcab47e570a;hp=8c1bbea0e554a14883cb5c7311e428849f717baf;hpb=d333fb781926d527fbe43553c1bc7351c2205312;p=awesomized%2Flibmemcached diff --git a/clients/memstat.c b/clients/memstat.c index 8c1bbea0..a04327e6 100644 --- a/clients/memstat.c +++ b/clients/memstat.c @@ -16,10 +16,16 @@ #define PROGRAM_DESCRIPTION "Output the state of a memcached cluster." /* Prototypes */ -void options_parse(int argc, char *argv[]); +static void options_parse(int argc, char *argv[]); +static void print_server_listing(memcached_st *memc, memcached_stat_st *stat, + memcached_server_st *server_list); +static void print_analysis_report(memcached_st *memc, + memcached_analysis_st *report, + memcached_server_st *server_list); static int opt_verbose= 0; static int opt_displayflag= 0; +static int opt_analyze= 0; static char *opt_servers= NULL; static struct option long_options[]= @@ -30,17 +36,18 @@ static struct option long_options[]= {"debug", no_argument, &opt_verbose, OPT_DEBUG}, {"servers", required_argument, NULL, OPT_SERVERS}, {"flag", no_argument, &opt_displayflag, OPT_FLAG}, + {"analyze", no_argument, NULL, OPT_ANALYZE}, {0, 0, 0, 0}, }; int main(int argc, char *argv[]) { - unsigned int x; memcached_return rc; memcached_st *memc; memcached_stat_st *stat; memcached_server_st *servers; memcached_server_st *server_list; + memcached_analysis_st *report; options_parse(argc, argv); @@ -69,12 +76,41 @@ int main(int argc, char *argv[]) if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_SOME_ERRORS) { printf("Failure to communicate with servers (%s)\n", - memcached_strerror(memc, rc)); + memcached_strerror(memc, rc)); exit(1); } server_list= memcached_server_list(memc); + if (opt_analyze) + { + report= memcached_analyze(memc, stat, &rc); + if (rc != MEMCACHED_SUCCESS || report == NULL) + { + printf("Failure to analyze servers (%s)\n", + memcached_strerror(memc, rc)); + exit(1); + } + print_analysis_report(memc, report, server_list); + free(report); + } + else + print_server_listing(memc, stat, server_list); + + free(stat); + free(opt_servers); + + memcached_free(memc); + + return 0; +} + +static void print_server_listing(memcached_st *memc, memcached_stat_st *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++) { @@ -84,7 +120,7 @@ int main(int argc, char *argv[]) list= memcached_stat_get_keys(memc, &stat[x], &rc); printf("Server: %s (%u)\n", memcached_server_name(memc, server_list[x]), - memcached_server_port(memc, server_list[x])); + memcached_server_port(memc, server_list[x])); for (ptr= list; *ptr; ptr++) { memcached_return rc; @@ -97,16 +133,44 @@ int main(int argc, char *argv[]) free(list); printf("\n"); } +} - free(stat); - free(opt_servers); +static void print_analysis_report(memcached_st *memc, + memcached_analysis_st *report, + memcached_server_st *server_list) +{ + uint32_t server_count= memcached_server_count(memc); - memcached_free(memc); + printf("Memcached Cluster Analysis Report\n\n"); - return 0; + printf("\tNumber of Servers Analyzed : %d\n", server_count); + printf("\tAverage Item Size (incl/overhead) : %u bytes\n", + report->average_item_size); + + if (server_count == 1) + { + printf("\nFor a detailed report, you must supply multiple servers.\n"); + return; + } + + 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]), + (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]), + (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]), + report->longest_uptime); + printf("\tPool-wide Hit Ratio : %1.f%%\n", report->pool_hit_ratio); + printf("\n"); } -void options_parse(int argc, char *argv[]) +static void options_parse(int argc, char *argv[]) { memcached_programs_help_st help_options[]= { @@ -118,7 +182,7 @@ void options_parse(int argc, char *argv[]) while (1) { - option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index); + option_rv= getopt_long(argc, argv, "Vhvds:a", long_options, &option_index); if (option_rv == -1) break; switch (option_rv) { @@ -139,6 +203,9 @@ void options_parse(int argc, char *argv[]) case OPT_SERVERS: /* --servers or -s */ opt_servers= strdup(optarg); break; + case OPT_ANALYZE: /* --analyze or -a */ + opt_analyze= OPT_ANALYZE; + break; case '?': /* getopt_long already printed an error message. */ exit(1);