libmemcached – memcached_mget似乎阻塞

我有一个单一的memcached服务器。 我使用libmemcached C api来连接它。 我正在使用非阻塞模式和没有应答模式(行为标志)。

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

问题是,memcached_mget似乎阻塞,即对于具有大约40ms的延迟的服务器,memcached_mget需要40ms来完成。 这不完全是asynchronous的。

这是我正在使用的代码:

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 

libmemcached的API始终阻塞。 “非阻塞”模式只是在套接字上设置该标志。 如果使用该标志,libmemcached通过调用poll()来自己阻塞。