3

memcachedサーバーが1つあります。libmemcachedCapiを使用してインターフェースします。非ブロッキングモードと応答モード(動作フラグ)を使用していません。

それが助けになるなら、私はnginxCモジュール内で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
4

1 に答える 1

0

libmemcachedのAPIは常にブロックしています。「ノンブロッキング」モードは、ソケットにそのフラグを設定するだけです。そのフラグを使用する場合、libmemcachedはpoll()を呼び出すことによって独自のブロッキングを行います。

于 2014-07-07T19:11:46.533 に答える