freeBSD 5.3 and memcached

Al Ermolaew alermo at bk.ru
Sun Mar 27 02:41:05 PST 2005


Hi All!

At once I shall apologize for my English :)

I had very strange problem with work of the memcached on
freeBSD. I have two servers with freeBSD 5.3 and on both
servers problem has repeated. I have a local machine with
Linux and on it problems have not arisen.....



Short example - data between 1400 and 2800 bytes would be
transferred very slowly

su-2.05b# ./memd_test 1248
memd_test: mc_aget result: <0.0001540>

su-2.05b# ./memd_test 1440
memd_test: mc_aget result: <0.0998720>

su-2.05b# ./memd_test 10440
memd_test: mc_aget result: <0.0005540>


1440 bytes are transferred from memcached at 0.09 seconds,
but 10440 bytes at 0.0005......

I upgrade em driver to version 2.05, but it has not
helped...
On lo device (127.0.0.1) all OK.

I test it with libevent 0.9, 1.0, 1.0b...
I test memcached 1.1.11, 1.1.12cr1, 1.1.9-snapshot
I using libmemcached for C test and Cached::Memcached for
perl...

Probably problem in a freeBSD kernel or em driver... I don't
know :(

Any ideas?



Regards,
    Alermo


------ simple memd_test.c based on regress.c from
libmemcached ------

/*

memcached test on freeBSD 5.3
data between 1400 and 2800 bytes would be transferred very
slowly - 0.1 sec
device em (Intel(R) PRO/1000 Gigabit Ethernet driver)

on device lo all OK.... Very strange.

*/

#include <err.h>
#include <sysexits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <errno.h>

#include <memcache.h>

int
main(int argc, char *argv[]) {
  struct memcache *mc = NULL;
  u_int32_t long_string_size = 0;
  char *long_string;
  u_int32_t i;

  if (argc > 1)
    long_string_size = strtol(argv[1], NULL, 10);

  if (long_string_size == 0)
    long_string_size = 2750;

  mc = mc_new();
  if (mc == NULL)
    err(EX_OSERR, "Unable to allocate a new memcache
object");

  mc_server_add(mc, "192.168.1.1", "11211");

  long_string = malloc(long_string_size);

  for (i = 0; i < long_string_size; ++i)
    long_string[i] = '0';

 mc_set(mc, "long_poisoned_string",
MCM_CSTRLEN("long_poisoned_string"), long_string,
long_string_size, 0, 0);

  struct timeval t0,t1;
  int res0,res1;
  void *val;


  res0 = gettimeofday(&t0,NULL);
  if(res0 < 0)
    warnx("Error found: %s\n",errno);

 // for (i = 0; i < 100; ++i )
     val = mc_aget(mc, "long_poisoned_string",
strlen("long_poisoned_string"));
 // warnx("res: %s\n",val);


  res1 = gettimeofday(&t1,NULL);
  if(res1 < 0)
    warnx("Error found: %s\n",errno);

  double tdif,sdif;
  sdif = t1.tv_usec-t0.tv_usec;
  sdif = sdif/1000000;
  tdif = t1.tv_sec-t0.tv_sec;
  tdif = tdif+sdif;

  warnx("mc_aget result: <%.7f>\n", tdif );

  mc_free(mc);

  return EX_OK;
}




More information about the memcached mailing list