X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fmemslap.c;h=38343b86de40f60f732a93cebcba0838e2a0ae90;hb=d227f2a06b136be62333f220b80226c0ec1a472f;hp=298453dda31727fafc7da54c87c7b41db47c615b;hpb=ad624f93ee91351c4f3839ca0dc1a9981644d391;p=m6w6%2Flibmemcached diff --git a/clients/memslap.c b/clients/memslap.c index 298453dd..38343b86 100644 --- a/clients/memslap.c +++ b/clients/memslap.c @@ -13,8 +13,22 @@ * Mingqiang Zhuang * */ +#include "config.h" + +#include #include #include +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + #include "ms_sigsegv.h" #include "ms_setting.h" @@ -24,56 +38,65 @@ #define PROGRAM_DESCRIPTION \ "Generates workload against memcached servers." +#ifdef __sun + /* For some odd reason the option struct on solaris defines the argument + * as char* and not const char* + */ +#define OPTIONSTRING char* +#else +#define OPTIONSTRING const char* +#endif + /* options */ static struct option long_options[]= { - { "servers", required_argument, NULL, + { (OPTIONSTRING)"servers", required_argument, NULL, OPT_SERVERS }, - { "threads", required_argument, NULL, + { (OPTIONSTRING)"threads", required_argument, NULL, OPT_THREAD_NUMBER }, - { "concurrency", required_argument, NULL, + { (OPTIONSTRING)"concurrency", required_argument, NULL, OPT_CONCURRENCY }, - { "conn_sock", required_argument, NULL, + { (OPTIONSTRING)"conn_sock", required_argument, NULL, OPT_SOCK_PER_CONN }, - { "execute_number", required_argument, NULL, + { (OPTIONSTRING)"execute_number", required_argument, NULL, OPT_EXECUTE_NUMBER }, - { "time", required_argument, NULL, + { (OPTIONSTRING)"time", required_argument, NULL, OPT_TIME }, - { "cfg_cmd", required_argument, NULL, + { (OPTIONSTRING)"cfg_cmd", required_argument, NULL, OPT_CONFIG_CMD }, - { "win_size", required_argument, NULL, + { (OPTIONSTRING)"win_size", required_argument, NULL, OPT_WINDOW_SIZE }, - { "fixed_size", required_argument, NULL, + { (OPTIONSTRING)"fixed_size", required_argument, NULL, OPT_FIXED_LTH }, - { "verify", required_argument, NULL, + { (OPTIONSTRING)"verify", required_argument, NULL, OPT_VERIFY }, - { "division", required_argument, NULL, + { (OPTIONSTRING)"division", required_argument, NULL, OPT_GETS_DIVISION }, - { "stat_freq", required_argument, NULL, + { (OPTIONSTRING)"stat_freq", required_argument, NULL, OPT_STAT_FREQ }, - { "exp_verify", required_argument, NULL, + { (OPTIONSTRING)"exp_verify", required_argument, NULL, OPT_EXPIRE }, - { "overwrite", required_argument, NULL, + { (OPTIONSTRING)"overwrite", required_argument, NULL, OPT_OVERWRITE }, - { "reconnect", no_argument, NULL, + { (OPTIONSTRING)"reconnect", no_argument, NULL, OPT_RECONNECT }, - { "udp", no_argument, NULL, + { (OPTIONSTRING)"udp", no_argument, NULL, OPT_UDP }, - { "facebook", no_argument, NULL, + { (OPTIONSTRING)"facebook", no_argument, NULL, OPT_FACEBOOK_TEST }, - { "binary", no_argument, NULL, + { (OPTIONSTRING)"binary", no_argument, NULL, OPT_BINARY_PROTOCOL }, - { "tps", required_argument, NULL, + { (OPTIONSTRING)"tps", required_argument, NULL, OPT_TPS }, - { "rep_write", required_argument, NULL, + { (OPTIONSTRING)"rep_write", required_argument, NULL, OPT_REP_WRITE_SRV }, - { "verbose", no_argument, NULL, + { (OPTIONSTRING)"verbose", no_argument, NULL, OPT_VERBOSE }, - { "help", no_argument, NULL, + { (OPTIONSTRING)"help", no_argument, NULL, OPT_HELP }, - { "version", no_argument, NULL, + { (OPTIONSTRING)"version", no_argument, NULL, OPT_VERSION }, - { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, }; /* Prototypes */ @@ -89,7 +112,7 @@ static void ms_options_parse(int argc, char *argv[]); static int ms_check_para(void); static void ms_statistic_init(void); static void ms_stats_init(void); -static void ms_print_statistics(int time); +static void ms_print_statistics(int in_time); static void ms_print_memslap_stats(struct timeval *start_time, struct timeval *end_time); static void ms_monitor_slap_mode(void); @@ -103,6 +126,10 @@ static void ms_sync_lock_init() pthread_mutex_init(&ms_global.init_lock.lock, NULL); pthread_cond_init(&ms_global.init_lock.cond, NULL); + ms_global.warmup_lock.count = 0; + pthread_mutex_init(&ms_global.warmup_lock.lock, NULL); + pthread_cond_init(&ms_global.warmup_lock.cond, NULL); + ms_global.run_lock.count= 0; pthread_mutex_init(&ms_global.run_lock.lock, NULL); pthread_cond_init(&ms_global.run_lock.cond, NULL); @@ -118,6 +145,9 @@ static void ms_sync_lock_destroy() pthread_mutex_destroy(&ms_global.init_lock.lock); pthread_cond_destroy(&ms_global.init_lock.cond); + pthread_mutex_destroy(&ms_global.warmup_lock.lock); + pthread_cond_destroy(&ms_global.warmup_lock.cond); + pthread_mutex_destroy(&ms_global.run_lock.lock); pthread_cond_destroy(&ms_global.run_lock.cond); @@ -154,7 +184,7 @@ static void ms_global_struct_destroy() */ static void ms_version_command(const char *command_name) { - printf("%s v%u.%u\n", command_name, 1, 0); + printf("%s v%u.%u\n", command_name, 1U, 0U); exit(0); } @@ -277,7 +307,7 @@ void ms_help_command(const char *command_name, const char *description) { char *help_message= NULL; - printf("%s v%u.%u\n", command_name, 1, 0); + printf("%s v%u.%u\n", command_name, 1U, 0U); printf(" %s\n\n", description); printf( "Usage:\n" @@ -288,6 +318,7 @@ void ms_help_command(const char *command_name, const char *description) { printf(" -%c, --%s%c\n", long_options[x].val, long_options[x].name, long_options[x].has_arg ? '=' : ' '); + if ((help_message= (char *)ms_lookup_help(long_options[x].val)) != NULL) { printf(" %s\n", help_message); @@ -407,7 +438,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_CONCURRENCY: /* --concurrency or -c */ - ms_setting.nconns= atoi(optarg); + ms_setting.nconns= (uint32_t)strtoul(optarg, (char **) NULL, 10); if (ms_setting.nconns <= 0) { fprintf(stderr, "Concurrency must be greater than 0.:-)\n"); @@ -416,7 +447,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_EXECUTE_NUMBER: /* --execute_number or -x */ - ms_setting.exec_num= atoll(optarg); + ms_setting.exec_num= (int)strtol(optarg, (char **) NULL, 10); if (ms_setting.exec_num <= 0) { fprintf(stderr, "Execute number must be greater than 0.:-)\n"); @@ -425,7 +456,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_THREAD_NUMBER: /* --threads or -T */ - ms_setting.nthreads= atoi(optarg); + ms_setting.nthreads= (uint32_t)strtoul(optarg, (char **) NULL, 10); if (ms_setting.nthreads <= 0) { fprintf(stderr, "Threads number must be greater than 0.:-)\n"); @@ -434,7 +465,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_FIXED_LTH: /* --fixed_size or -X */ - ms_setting.fixed_value_size= (size_t)atoi(optarg); + ms_setting.fixed_value_size= (size_t)strtoull(optarg, (char **) NULL, 10); if ((ms_setting.fixed_value_size <= 0) || (ms_setting.fixed_value_size > MAX_VALUE_SIZE)) { @@ -455,7 +486,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_GETS_DIVISION: /* --division or -d */ - ms_setting.mult_key_num= atoi(optarg); + ms_setting.mult_key_num= (int)strtol(optarg, (char **) NULL, 10); if (ms_setting.mult_key_num <= 0) { fprintf(stderr, "Multi-get key number must be greater than 0.:-)\n"); @@ -541,7 +572,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_SOCK_PER_CONN: /* --conn_sock or -n */ - ms_setting.sock_per_conn= atoi(optarg); + ms_setting.sock_per_conn= (uint32_t)strtoul(optarg, (char **) NULL, 10); if (ms_setting.sock_per_conn <= 0) { fprintf(stderr, "Number of socks of each concurrency " @@ -578,7 +609,7 @@ static void ms_options_parse(int argc, char *argv[]) break; case OPT_REP_WRITE_SRV: /* --rep_write or -p */ - ms_setting.rep_write_srv= atoi(optarg); + ms_setting.rep_write_srv= (uint32_t)strtoul(optarg, (char **) NULL, 10); if (ms_setting.rep_write_srv <= 0) { fprintf(stderr, @@ -603,11 +634,20 @@ static int ms_check_para() { if (ms_setting.srv_str == NULL) { - fprintf(stderr, "No Servers provided.\n\n"); - return -1; + char *temp; + + if ((temp= getenv("MEMCACHED_SERVERS"))) + { + ms_setting.srv_str= strdup(temp); + } + else + { + fprintf(stderr, "No Servers provided\n\n"); + return -1; + } } - if (ms_setting.nconns % ms_setting.nthreads != 0) + if (ms_setting.nconns % (uint32_t)ms_setting.nthreads != 0) { fprintf(stderr, "Concurrency must be the multiples of threads count.\n"); return -1; @@ -666,53 +706,45 @@ static void ms_print_memslap_stats(struct timeval *start_time, char buf[1024]; char *pos= buf; - pos+= sprintf(pos, - "cmd_get: %llu\n", - (unsigned long long)ms_stats.cmd_get); - pos+= sprintf(pos, - "cmd_set: %llu\n", - (unsigned long long)ms_stats.cmd_set); - pos+= sprintf(pos, - "get_misses: %llu\n", - (unsigned long long)ms_stats.get_misses); + pos+= sprintf(pos, "cmd_get: %zu\n", + ms_stats.cmd_get); + pos+= sprintf(pos, "cmd_set: %zu\n", + ms_stats.cmd_set); + pos+= sprintf(pos, "get_misses: %zu\n", + ms_stats.get_misses); if (ms_setting.verify_percent > 0) { - pos+= sprintf(pos, "verify_misses: %llu\n", - (unsigned long long)ms_stats.vef_miss); - pos+= sprintf(pos, "verify_failed: %llu\n", - (unsigned long long)ms_stats.vef_failed); + pos+= sprintf(pos, "verify_misses: %zu\n", + ms_stats.vef_miss); + pos+= sprintf(pos, "verify_failed: %zu\n", + ms_stats.vef_failed); } if (ms_setting.exp_ver_per > 0) { - pos+= sprintf(pos, "expired_get: %llu\n", - (unsigned long long)ms_stats.exp_get); - pos+= sprintf(pos, "unexpired_unget: %llu\n", - (unsigned long long)ms_stats.unexp_unget); + pos+= sprintf(pos, "expired_get: %zu\n", + ms_stats.exp_get); + pos+= sprintf(pos, "unexpired_unget: %zu\n", + ms_stats.unexp_unget); } pos+= sprintf(pos, - "written_bytes: %llu\n", - (unsigned long long)ms_stats.bytes_written); - pos+= sprintf(pos, - "read_bytes: %llu\n", - (unsigned long long)ms_stats.bytes_read); - pos+= sprintf(pos, - "object_bytes: %llu\n", - (unsigned long long)ms_stats.obj_bytes); + "written_bytes: %zu\n", + ms_stats.bytes_written); + pos+= sprintf(pos, "read_bytes: %zu\n", + ms_stats.bytes_read); + pos+= sprintf(pos, "object_bytes: %zu\n", + ms_stats.obj_bytes); if (ms_setting.udp || ms_setting.facebook_test) { - pos+= sprintf(pos, - "packet_disorder: %llu\n", - (unsigned long long)ms_stats.pkt_disorder); - pos+= sprintf(pos, - "packet_drop: %llu\n", - (unsigned long long)ms_stats.pkt_drop); - pos+= sprintf(pos, - "udp_timeout: %llu\n", - (unsigned long long)ms_stats.udp_timeout); + pos+= sprintf(pos, "packet_disorder: %zu\n", + ms_stats.pkt_disorder); + pos+= sprintf(pos, "packet_drop: %zu\n", + ms_stats.pkt_drop); + pos+= sprintf(pos, "udp_timeout: %zu\n", + ms_stats.udp_timeout); } if (ms_setting.stat_freq > 0) @@ -746,19 +778,26 @@ static void ms_monitor_slap_mode() int second= 0; struct timeval start_time, end_time; + /* Wait all the threads complete initialization. */ + pthread_mutex_lock(&ms_global.init_lock.lock); + while (ms_global.init_lock.count < ms_setting.nthreads) + { + pthread_cond_wait(&ms_global.init_lock.cond, + &ms_global.init_lock.lock); + } + pthread_mutex_unlock(&ms_global.init_lock.lock); + /* only when there is no set operation it need warm up */ if (ms_setting.cmd_distr[CMD_SET].cmd_prop < PROP_ERROR) { /* Wait all the connects complete warm up. */ - pthread_mutex_lock(&ms_global.init_lock.lock); - while (ms_global.init_lock.count < ms_setting.nconns) + pthread_mutex_lock(&ms_global.warmup_lock.lock); + while (ms_global.warmup_lock.count < ms_setting.nconns) { - pthread_cond_wait(&ms_global.init_lock.cond, - &ms_global.init_lock.lock); + pthread_cond_wait(&ms_global.warmup_lock.cond, &ms_global.warmup_lock.lock); } - pthread_mutex_unlock(&ms_global.init_lock.lock); + pthread_mutex_unlock(&ms_global.warmup_lock.lock); } - ms_global.finish_warmup= true; /* running in "run time" mode, user specify run time */ @@ -771,8 +810,8 @@ static void ms_monitor_slap_mode() second++; if ((ms_setting.stat_freq > 0) && (second % ms_setting.stat_freq == 0) - && ((int32_t)ms_stats.active_conns >= ms_setting.nconns) - && (ms_stats.active_conns <= (uint32_t)INT_MAX)) + && (ms_stats.active_conns >= ms_setting.nconns) + && (ms_stats.active_conns <= INT_MAX)) { ms_print_statistics(second); }