You need to sign in or sign up before continuing.
Commit 39bf4402 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

Provide custom command to benchmark against via args

parent fc05e8c8
...@@ -328,41 +328,44 @@ static void benchmark(const char *title, const char *cmd, int len) { ...@@ -328,41 +328,44 @@ static void benchmark(const char *title, const char *cmd, int len) {
freeAllClients(); freeAllClients();
} }
void parseOptions(int argc, const char **argv) { /* Returns number of consumed options. */
int parseOptions(int argc, const char **argv) {
int i; int i;
int lastarg;
int exit_status = 1;
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
int lastarg = i==argc-1; lastarg = (i == (argc-1));
if (!strcmp(argv[i],"-c") && !lastarg) { if (!strcmp(argv[i],"-c")) {
config.numclients = atoi(argv[i+1]); if (lastarg) goto invalid;
i++; config.numclients = atoi(argv[++i]);
} else if (!strcmp(argv[i],"-n") && !lastarg) { } else if (!strcmp(argv[i],"-n")) {
config.requests = atoi(argv[i+1]); if (lastarg) goto invalid;
i++; config.requests = atoi(argv[++i]);
} else if (!strcmp(argv[i],"-k") && !lastarg) { } else if (!strcmp(argv[i],"-k")) {
config.keepalive = atoi(argv[i+1]); if (lastarg) goto invalid;
i++; config.keepalive = atoi(argv[++i]);
} else if (!strcmp(argv[i],"-h") && !lastarg) { } else if (!strcmp(argv[i],"-h")) {
config.hostip = strdup(argv[i+1]); if (lastarg) goto invalid;
i++; config.hostip = strdup(argv[++i]);
} else if (!strcmp(argv[i],"-p") && !lastarg) { } else if (!strcmp(argv[i],"-p")) {
config.hostport = atoi(argv[i+1]); if (lastarg) goto invalid;
i++; config.hostport = atoi(argv[++i]);
} else if (!strcmp(argv[i],"-s") && !lastarg) { } else if (!strcmp(argv[i],"-s")) {
config.hostsocket = strdup(argv[i+1]); if (lastarg) goto invalid;
i++; config.hostsocket = strdup(argv[++i]);
} else if (!strcmp(argv[i],"-d") && !lastarg) { } else if (!strcmp(argv[i],"-d")) {
config.datasize = atoi(argv[i+1]); if (lastarg) goto invalid;
i++; config.datasize = atoi(argv[++i]);
if (config.datasize < 1) config.datasize=1; if (config.datasize < 1) config.datasize=1;
if (config.datasize > 1024*1024) config.datasize = 1024*1024; if (config.datasize > 1024*1024) config.datasize = 1024*1024;
} else if (!strcmp(argv[i],"-r") && !lastarg) { } else if (!strcmp(argv[i],"-r")) {
if (lastarg) goto invalid;
config.randomkeys = 1; config.randomkeys = 1;
config.randomkeys_keyspacelen = atoi(argv[i+1]); config.randomkeys_keyspacelen = atoi(argv[++i]);
if (config.randomkeys_keyspacelen < 0) if (config.randomkeys_keyspacelen < 0)
config.randomkeys_keyspacelen = 0; config.randomkeys_keyspacelen = 0;
i++;
} else if (!strcmp(argv[i],"-q")) { } else if (!strcmp(argv[i],"-q")) {
config.quiet = 1; config.quiet = 1;
} else if (!strcmp(argv[i],"-l")) { } else if (!strcmp(argv[i],"-l")) {
...@@ -371,30 +374,44 @@ void parseOptions(int argc, const char **argv) { ...@@ -371,30 +374,44 @@ void parseOptions(int argc, const char **argv) {
config.debug = 1; config.debug = 1;
} else if (!strcmp(argv[i],"-I")) { } else if (!strcmp(argv[i],"-I")) {
config.idlemode = 1; config.idlemode = 1;
} else if (!strcmp(argv[i],"--help")) {
exit_status = 0;
goto usage;
} else { } else {
printf("Wrong option '%s' or option argument missing\n\n",argv[i]); /* Assume the user meant to provide an option when the arg starts
printf("Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]\n\n"); * with a dash. We're done otherwise and should use the remainder
printf(" -h <hostname> Server hostname (default 127.0.0.1)\n"); * as the command and arguments for running the benchmark. */
printf(" -p <port> Server port (default 6379)\n"); if (argv[i][0] == '-') goto invalid;
printf(" -s <socket> Server socket (overrides host and port)\n"); return i;
printf(" -c <clients> Number of parallel connections (default 50)\n");
printf(" -n <requests> Total number of requests (default 10000)\n");
printf(" -d <size> Data size of SET/GET value in bytes (default 2)\n");
printf(" -k <boolean> 1=keep alive 0=reconnect (default 1)\n");
printf(" -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD\n");
printf(" Using this option the benchmark will get/set keys\n");
printf(" in the form mykey_rand000000012456 instead of constant\n");
printf(" keys, the <keyspacelen> argument determines the max\n");
printf(" number of values for the random number. For instance\n");
printf(" if set to 10 only rand000000000000 - rand000000000009\n");
printf(" range will be allowed.\n");
printf(" -q Quiet. Just show query/sec values\n");
printf(" -l Loop. Run the tests forever\n");
printf(" -I Idle mode. Just open N idle connections and wait.\n");
printf(" -D Debug mode. more verbose.\n");
exit(1);
} }
} }
return i;
invalid:
printf("Invalid option \"%s\" or option argument missing\n\n",argv[i]);
usage:
printf("Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]\n\n");
printf(" -h <hostname> Server hostname (default 127.0.0.1)\n");
printf(" -p <port> Server port (default 6379)\n");
printf(" -s <socket> Server socket (overrides host and port)\n");
printf(" -c <clients> Number of parallel connections (default 50)\n");
printf(" -n <requests> Total number of requests (default 10000)\n");
printf(" -d <size> Data size of SET/GET value in bytes (default 2)\n");
printf(" -k <boolean> 1=keep alive 0=reconnect (default 1)\n");
printf(" -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD\n");
printf(" Using this option the benchmark will get/set keys\n");
printf(" in the form mykey_rand000000012456 instead of constant\n");
printf(" keys, the <keyspacelen> argument determines the max\n");
printf(" number of values for the random number. For instance\n");
printf(" if set to 10 only rand000000000000 - rand000000000009\n");
printf(" range will be allowed.\n");
printf(" -q Quiet. Just show query/sec values\n");
printf(" -l Loop. Run the tests forever\n");
printf(" -I Idle mode. Just open N idle connections and wait.\n");
printf(" -D Debug mode. more verbose.\n");
exit(exit_status);
} }
int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData) { int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData) {
...@@ -411,6 +428,9 @@ int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData ...@@ -411,6 +428,9 @@ int showThroughput(struct aeEventLoop *eventLoop, long long id, void *clientData
int main(int argc, const char **argv) { int main(int argc, const char **argv) {
int i; int i;
char *data, *cmd;
int len;
client c; client c;
signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN);
...@@ -436,7 +456,10 @@ int main(int argc, const char **argv) { ...@@ -436,7 +456,10 @@ int main(int argc, const char **argv) {
config.hostport = 6379; config.hostport = 6379;
config.hostsocket = NULL; config.hostsocket = NULL;
parseOptions(argc,argv); i = parseOptions(argc,argv);
argc -= i;
argv += i;
config.latency = zmalloc(sizeof(long long)*config.requests); config.latency = zmalloc(sizeof(long long)*config.requests);
if (config.keepalive == 0) { if (config.keepalive == 0) {
...@@ -451,10 +474,25 @@ int main(int argc, const char **argv) { ...@@ -451,10 +474,25 @@ int main(int argc, const char **argv) {
/* and will wait for every */ /* and will wait for every */
} }
do { /* Run benchmark with command in the remainder of the arguments. */
char *data, *cmd; if (argc) {
int len; sds title = sdsnew(argv[0]);
for (i = 1; i < argc; i++) {
title = sdscatlen(title, " ", 1);
title = sdscatlen(title, (char*)argv[i], strlen(argv[1]));
}
do {
len = redisFormatCommandArgv(&cmd,argc,argv,NULL);
benchmark(title,cmd,len);
free(cmd);
} while(config.loop);
return 0;
}
/* Run default benchmark suite. */
do {
data = zmalloc(config.datasize+1); data = zmalloc(config.datasize+1);
memset(data,'x',config.datasize); memset(data,'x',config.datasize);
data[config.datasize] = '\0'; data[config.datasize] = '\0';
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment