2013-03-24 120 views
3

我有一個memcached服務器。我使用libmemcached C API與它進行交互。我正在使用非阻塞模式並且沒有回覆模式(行爲標誌)。libmemcached - memcached_mget似乎阻止了

我也在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 
+0

您是否試過在日誌記錄之後獲取開始時間? – 2013-03-24 17:07:07

+0

是的,它是一樣的。 – florinp 2013-03-24 17:09:06

+0

是否設置了阻塞方法? – 2013-03-25 10:14:33

回答

0

libmemcached的API總是阻止。 「非阻塞」模式只是在套接字上設置該標誌。如果使用該標誌,則libmemcached通過調用poll()來執行自己的阻塞操作。

相關問題