On Nov 28, 4:31 am, Gregory Burd <
greg.b...@oracle.com> wrote:
> Which version of Berkeley DB were you using? Berkeley DB 4.8 performs
> much better on multi-core/multi-cpu tests with many threads.
The version is db-4.8.24 but I used mcben.py as Steve said it is just
toy.
So I tried again with libmemcached and I got good performance.
38717 w/s
136938 r/s
Here's the benchmark program
#!/bin/sh
spawn()
{
time $@ &
}
SERVER=
127.0.0.1:21201
THREADS=8
REQUESTS=2000000
VALUE_LENGTH=100
OPT="-s $SERVER -n $REQUESTS -l $VALUE_LENGTH"
export TIMEFORMAT='%R'
for i in `seq $THREADS`;do
spawn /home/mita/memcachedb-benchmark $OPT -i 0 -w
done
wait
sync; sync; sync
for i in `seq $THREADS`;do
spawn /home/mita/memcachedb-benchmark $OPT -i 0 -r
done
wait
/*
* memcachedb-benchmark
*/
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <libmemcached/memcached.h>
static void do_memcached_set(memcached_st *memc, const char *key,
size_t key_length, const char *value, size_t value_length)
{
memcached_return ret;
ret = memcached_set(memc, key, key_length, value, value_length, 0,
0);
if (ret != MEMCACHED_SUCCESS) {
warn("memcached_set: %s", memcached_strerror(memc, ret));
}
}
static void do_memcached_get(memcached_st *memc, const char *key,
size_t key_length)
{
memcached_return ret;
char *value;
size_t value_length;
uint32_t flags;
value = memcached_get(memc, key, key_length, &value_length,
&flags, &ret);
if (ret != MEMCACHED_SUCCESS)
warn("memcached_get: %s", memcached_strerror(memc, ret));
free(value);
}
static int id;
static void test(const char *server, const int value_length,
const int requests, const int command)
{
char key[20];
char *value;
struct memcached_st memc;
struct memcached_server_st *servers;
memcached_return ret;
int i;
value = malloc(value_length);
if (!value)
err(EXIT_FAILURE, "out of memory");
memset(value, '*', value_length);
memcached_create(&memc);
servers = memcached_servers_parse(server);
ret = memcached_server_push(&memc, servers);
if (ret != MEMCACHED_SUCCESS)
err(EXIT_FAILURE, "memcached_server_push failed");
for (i = 0; i < requests; i++) {
sprintf(key, "%04d-%011d", id, i);
if (command == 'w')
do_memcached_set(&memc, key, 16, value, value_length);
else
do_memcached_get(&memc, key, 16);
}
memcached_server_list_free(servers);
memcached_free(&memc);
}
static int value_length = 100;
static int requests = 100000;
static char *server = "
127.0.0.1:21201";
/* 'r' for Read, 'w' for Write request */
static int command = 'w';
static void parse_options(int argc, char **argv)
{
int c;
while ((c = getopt(argc, argv, "n:k:l:s:i:rw")) != -1) {
switch(c) {
case 'n':
requests = atoi(optarg);
break;
case 'l':
value_length = atoi(optarg);
break;
case 's':
server = optarg;
break;
case 'i':
id = atoi(optarg);
break;
case 'r':
command = 'r';
break;
case 'w':
command = 'w';
break;
default:
err(EXIT_FAILURE, "invalid option: %c", c);
}
}
}
int main(int argc, char **argv)
{
parse_options(argc, argv);
test(server, value_length, requests, command);
return 0;
}