libmemcached - memcached_mget似乎阻止了

时间:2013-03-24 17:02:07

标签: c asynchronous nginx memcached libmemcached

我有一个memcached服务器。我使用libmemcached C api与它进行交互。我使用非阻塞模式,没有回复模式(行为标志)。

如果有帮助,我也在nginx C模块中使用libmemcached。

问题是memcached_mget似乎阻塞,即对于延迟大约40ms的服务器,memcached_mget需要40ms才能完成。这不完全是异步。

以下是我正在使用的代码:

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

1 个答案:

答案 0 :(得分:0)

libmemcached的API始终是阻止的。 "非阻塞" mode只是在套接字上设置该标志。如果使用该标志,libmemcached会通过调用poll()来执行自己的阻塞。