论坛首页 综合技术论坛

memcached noreply 和tcp Nagle

浏览 2206 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-29  

memcached 对某些操作例如set,add支持noreply。也就是memcached 服务器不会对客户端进行应答。

假如在极短时间内,基于同一tcp connection(tcp_nodelay =false),进行2次操作,第1次是noreply,第2次need reply,并且2次的请求数据都非常小,会发生什么事呢?

下面基于java 客户端 xmemcached 1.3.5试一下,客户端和服务器分别部署在两台linux上。代码如下:

 

Java代码 
  1. for (int i = 0; i < 10; i++) {  
  2.      long start = System.currentTimeMillis();  
  3.      memcachedClient.setWithNoReply("a"0"Hello,xmemcached");//1  
  4.      //memcachedClient.set("a", 0, "Hello,xmemcached");//2  
  5.      Thread.sleep(1);  
  6.      String value = memcachedClient.get("a");  
  7.      long end = System.currentTimeMillis();  
  8.      System.out.println("ttl(ms)=" + (end - start));  
  9.  }  
 

 

打印出来的花费时间除了第一次,其他的都需要40ms左右。如果不使用setWithNoReply而使用set,就几乎0ms。

40ms的延时是受了nagle 算法和ack delayed的影响。不太清楚的同学可gg一下或http://www.iteye.com/topic/1110883#2201434,该帖子的作者阐释的比较具体了。八卦一下,该作者貌似同时也是xmemcached 的作者。

 

附:setWithNoReply和get之间睡眠一秒,是为了避免这两个操作被装进同一tcp包里。一开始测不出40ms的延时,还以为哪里出了问题,通过tcpdump发现两个操作在同一个tcp包发送。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics