libmemcached — кажется, что memcached_mget блокирует

У меня есть один сервер memcached. Я использую libmemcached C API для взаимодействия с ним. Я использую неблокирующий режим и режим без ответа (флаги поведения).

Я также использую libmemcached внутри модуля C nginx, если это помогает.

Проблема в том, что memcached_mget блокируется, то есть для сервера с задержкой около 40 мс выполнение memcached_mget занимает 40 мс. Это не совсем асинхронно.

Вот код, который я использую:

const char* localKeys[2] = {"key1", "key2"};
size_t k_length[2] = {4, 4};

gettimeofday(&t1, NULL);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no block: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK));
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no reply: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY));
retFt = memcached_mget(memc, localKeys, k_length, 2);
gettimeofday(&t2, NULL);

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0, "memcached_mget duration (microseconds): %d, result : %d", t2.tv_usec - t1.tv_usec, retFt);

retFt = memcached_fetch_execute(memc, fp, &callback_struct, 1);

Я использую протокол ASCII. Пробовал использовать двоичный код, но это не помогло. Я также пробовал memcached_mget_execute. Я имитирую задержку с помощью tc, например:

tc qdisc add dev lo root netem delay 20ms

person florinp    schedule 24.03.2013    source источник
comment
Вы пытались получить время начала после регистрации?   -  person Some programmer dude    schedule 24.03.2013
comment
также блокируется метод set?   -  person Chuan Ma    schedule 25.03.2013
comment
Нет, метод set не блокирует. В документации также сказано, что этот метод не будет блокироваться, но и про memcached_mget сказано, что он не будет блокироваться.   -  person florinp    schedule 25.03.2013
comment
Установка значения с помощью memcached_set на сервере с задержкой 40 миллисекунд занимает 55 микросекунд (моделируется с использованием tc, как описано выше).   -  person florinp    schedule 25.03.2013


Ответы (1)


API libmemcached всегда блокируется. «Неблокирующий» режим просто устанавливает этот флаг на сокете. Если вы используете этот флаг, libmemcached выполняет собственную блокировку, вызывая poll().

person Martin C. Martin    schedule 07.07.2014