libmemcached-memcached\u mget似乎被阻塞了

libmemcached-memcached\u mget似乎被阻塞了,c,asynchronous,nginx,memcached,libmemcached,C,Asynchronous,Nginx,Memcached,Libmemcached,我有一个memcached服务器。我使用libmemcached C api与它进行接口。我使用的是非阻塞模式和无应答模式(行为标志) 如果有帮助的话,我还在nginx C模块中使用libmemcached 问题是memcached_mget似乎会阻塞,即对于延迟约40毫秒的服务器,memcached_mget需要40毫秒才能完成。这并不完全是异步的 以下是我正在使用的代码: const char* localKeys[2] = {"key1", "key2"}; size_t k_length

我有一个memcached服务器。我使用libmemcached C api与它进行接口。我使用的是非阻塞模式和无应答模式(行为标志)

如果有帮助的话,我还在nginx C模块中使用libmemcached

问题是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

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

您是否尝试在日志记录后获取开始时间?set方法是否也会阻塞?否,set方法似乎是非阻塞的。文档中还指出,该方法不会阻塞,但它也表示不会阻塞memcached_mget。在延迟为40毫秒的服务器上使用memcached_set设置值需要55微秒(如上所述,使用tc模拟)。