文档章节

spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据

旁观者-郑昀
 旁观者-郑昀
发布于 2013/02/08 22:45
字数 948
阅读 168
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

先说一下结论。
如果你没有特意在   spymemcached    client bean definition  里配置   useNagleAlgorithm  属性为 True,
那么 默认 spymemcached 是不启用 Nagle 算法的
所以默认情况下不会引发恨少在《 libmemcached的MEMCACHED_MAX_BUFFER问题》一文中提及的“ shell脚本set 1000次8KB的item,只要3s左右,平均需要3ms。而C++版本则需要39s左右,平均耗时39ms……发现8KB的数据需要发送两次,两次write都是非常快的,但是 等memcached返回时用了很多时间,主要的时间就耗费在这个地方”现象。咱们业务中心可以排除这个嫌疑。
 
什么是 Nagle 算法?
TCP/IP 协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能地利用网络带宽,TCP总是希望尽 可能地发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。 Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
N agle算法的基本定义是 任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到

        Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释): 

      (1)如果包长度达到MSS,则允许发送

      (2)如果该包含有FIN,则允许发送;

      (3)设置了TCP_NODELAY选项,则允许发送;

      (4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送; 

      (5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
 
spymemcached 默认不启用 Nagle 算法
/net/spy/memcached/ConnectionFactoryBuilder.java 中定义如下:
/**
* Builder for more easily configuring a ConnectionFactory.
*/
public class ConnectionFactoryBuilder {
  protected boolean useNagle = false;
……
  public ConnectionFactoryBuilder(ConnectionFactory cf) {
……
     setUseNagleAlgorithm ( cf . useNagleAlgorithm ());
   }
   /**
* Set to true if you'd like to enable the Nagle algorithm.
*/
   public ConnectionFactoryBuilder setUseNagleAlgorithm ( boolean to ) {
     useNagle = to ;
     return this ;
   }
然后,转到 MemcachedConnection.java,说到底还是调用 socket 的 setTcpNoDelay 方法:
  protected List<MemcachedNode> createConnections(
……
      ch.socket(). setTcpNoDelay(!this.connectionFactory.useNagleAlgorithm());
 
通过 bean definition 可设置 useNagleAlgorithm
参考   SpringIntegration  文档,spring 里配置如下:
<beanid="memcachedClient"class="net.spy.memcached.spring.MemcachedClientFactoryBean">…… 
   <propertyname="useNagleAlgorithm"value="false"/>   </bean>
 
p.s.:
1)另一个常用的 memcached java client—— xmemcached 从1.3.6版本开始也默认禁用了 Nagle 算法。

2mongo-java-driver 默认也禁用 Nagle 算法(DBPort.java 63行)。

参考资源:
2)火丁,2012, Memcached二三事儿
3)2009,  Issue 88:  Turn off TCP nagle can hugely improve performance;

 

 

http://ww4.sinaimg.cn/bmiddle/61b889f5jw1e0heyvf2bjj.jpg
http://ww4.sinaimg.cn/bmiddle/722cf283jw1e0gmqya3f5j.jpg

© 著作权归作者所有

旁观者-郑昀
粉丝 101
博文 77
码字总数 162700
作品 0
朝阳
私信 提问
关于 Multiget hole:spymemcached对此的实现方法

火丁说: 『 Multiget的无底洞问题 Facebook在Memcached的实际应用中,发现了Multiget无底洞问 题,具体表现为:出于效率的考虑,很多Memcached应用都已Multiget操作为主,随着访问量的增加,...

旁观者-郑昀
2013/02/08
128
0
spymemcached :某个mc节点操作连续超时超过998次就 Auto-Reconne...

spymemcached 中,一个 mc client 与某一个 mc node 之间已建立的 connection 上, 如果执行操作屡屡超时(net.spy.memcached.OperationTimeoutException), 那么,有一个计数器专门记录超时...

旁观者-郑昀
2013/02/08
163
0
三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiti...

旁观者-郑昀
2013/02/08
217
0
三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiti...

mal
2014/05/19
1K
0
三个实例演示 Java Thread Dump 日志分析

dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) ...

小小小七
2014/07/24
56
0

没有更多内容

加载失败,请刷新页面

加载更多

如何管stderr,而不是stdout?

我有一个要写入信息的程序stdout和stderr ,我需要grep通过什么是未来标准错误 ,而忽视标准输出 。 我当然可以分2步完成: command > /dev/null 2> temp.filegrep 'something' temp.file...

技术盛宴
20分钟前
4
0
centos7.5上通过docker安装并运行mysql5.7

1. docker pull mysql:5.7 2. docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7...

Ryub
24分钟前
5
0
什么是比赛条件?

在编写多线程应用程序时,遇到的最常见问题之一是竞争条件。 我对社区的问题是: 什么是比赛条件? 您如何检测到它们? 您如何处理它们? 最后,如何防止它们发生? #1楼 当设备或系统试图同...

javail
35分钟前
5
0
SpringMVC源码分析-DispatcherServlet-init方法分析

上一篇:SpringMVC源码分析-DispatcherServlet实例化干了些什么 先吐槽一下。。。写了两小时的博客突然被俺家小屁孩按了刷新,东西不见了,建议OSCHINA能够自动定时保存啊。让我先安静一下。...

特拉仔
43分钟前
5
0
python协程 生成器

协程,又称微线程,纤程。英文名Coroutine。 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子...

沙门行道
53分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部