X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/58cd710344c2a18c6d55895dc960cd141109c5a8..85a2775298a85b80ccaaf31082c479b7968158b1:/benchmark.c diff --git a/benchmark.c b/benchmark.c index bd1e8611..2984efe4 100644 --- a/benchmark.c +++ b/benchmark.c @@ -78,6 +78,7 @@ static struct config { list *clients; int quiet; int loop; + int idlemode; } config; typedef struct _client { @@ -136,7 +137,7 @@ static void freeAllClients(void) { static void resetClient(client c) { aeDeleteFileEvent(config.el,c->fd,AE_WRITABLE); aeDeleteFileEvent(config.el,c->fd,AE_READABLE); - aeCreateFileEvent(config.el,c->fd, AE_WRITABLE,writeHandler,c,NULL); + aeCreateFileEvent(config.el,c->fd, AE_WRITABLE,writeHandler,c); sdsfree(c->ibuf); c->ibuf = sdsempty(); c->readlen = (c->replytype == REPLY_BULK || @@ -321,14 +322,15 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) int len = sdslen(c->obuf) - c->written; int nwritten = write(c->fd, ptr, len); if (nwritten == -1) { - fprintf(stderr, "Writing to socket: %s\n", strerror(errno)); + if (errno != EPIPE) + fprintf(stderr, "Writing to socket: %s\n", strerror(errno)); freeClient(c); return; } c->written += nwritten; if (sdslen(c->obuf) == c->written) { aeDeleteFileEvent(config.el,c->fd,AE_WRITABLE); - aeCreateFileEvent(config.el,c->fd,AE_READABLE,readHandler,c,NULL); + aeCreateFileEvent(config.el,c->fd,AE_READABLE,readHandler,c); c->state = CLIENT_READREPLY; } } @@ -352,7 +354,7 @@ static client createClient(void) { c->written = 0; c->totreceived = 0; c->state = CLIENT_CONNECTING; - aeCreateFileEvent(config.el, c->fd, AE_WRITABLE, writeHandler, c, NULL); + aeCreateFileEvent(config.el, c->fd, AE_WRITABLE, writeHandler, c); config.liveclients++; listAddNodeTail(config.clients,c); return c; @@ -365,9 +367,7 @@ static void createMissingClients(client c) { sdsfree(new->obuf); new->obuf = sdsdup(c->obuf); if (config.randomkeys) randomizeClientKey(c); - new->replytype = c->replytype; - if (c->replytype == REPLY_BULK) - new->readlen = -1; + prepareClientForReply(new,c->replytype); } } @@ -453,6 +453,8 @@ void parseOptions(int argc, char **argv) { config.loop = 1; } else if (!strcmp(argv[i],"-D")) { config.debug = 1; + } else if (!strcmp(argv[i],"-I")) { + config.idlemode = 1; } else { printf("Wrong option '%s' or option argument missing\n\n",argv[i]); printf("Usage: redis-benchmark [-h ] [-p ] [-c ] [-n [-k ]\n\n"); @@ -471,6 +473,7 @@ void parseOptions(int argc, char **argv) { 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); } @@ -495,6 +498,7 @@ int main(int argc, char **argv) { config.randomkeys_keyspacelen = 0; config.quiet = 0; config.loop = 0; + config.idlemode = 0; config.latency = NULL; config.clients = listCreate(); config.latency = zmalloc(sizeof(int)*(MAX_LATENCY+1)); @@ -508,6 +512,18 @@ int main(int argc, char **argv) { printf("WARNING: keepalive disabled, you probably need 'echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse' for Linux and 'sudo sysctl -w net.inet.tcp.msl=1000' for Mac OS X in order to use a lot of clients/requests\n"); } + if (config.idlemode) { + printf("Creating %d idle connections and waiting forever (Ctrl+C when done)\n", config.numclients); + prepareForBenchmark(); + c = createClient(); + if (!c) exit(1); + c->obuf = sdsempty(); + prepareClientForReply(c,REPLY_RETCODE); /* will never receive it */ + createMissingClients(c); + aeMain(config.el); + /* and will wait for every */ + } + do { prepareForBenchmark(); c = createClient();