先说一下结论。

那么默认 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算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于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 createConnections(

……

ch.socket().setTcpNoDelay(!this.connectionFactory.useNagleAlgorithm());

通过 bean definition 可设置 useNagleAlgorithm

参考SpringIntegration文档,spring 里配置如下:

……

p.s.:

1)另一个常用的 memcached java client——xmemcached 从1.3.6版本开始也默认禁用了 Nagle 算法。

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

参考资源:

3)2009, Issue 88:  Turn off TCP nagle can hugely improve performance;

1)55最佳实践系列:MongoDB最佳实践(2012-12-15 15:48)

2)55最佳实践系列:Logging最佳实践(2012-12-15 16:43)

3)最佳实践系列:前端代码标准和最佳实践(2012-12-19 23:33)

tcp_nodelay memcached java_spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据相关推荐

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

    先说一下结论. 如果你没有特意在 spymemcached 的 client bean definition 里配置 useNagleAlgorithm 属性为 True, 那么默认 spymemca ...

  2. gprs模块发送html,GPRS模块通过TCP/IP方式发送数据流程

    首先介绍一下GPRS的接入方式,在中国有CMWAP和CMNET两种方式.CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式.前者是为手机WAP上网而设立的,后者则主要是为PC.笔记 ...

  3. ip fragmentation_为什么 TCP/IP 协议会拆分数据

    来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-segment-ip-packet/ 为什么这么设计(Why's THE Design ...

  4. TCP/IP / 如何保证数据包传输的有序可靠?

    一.答案 对字节流分段并进行编号然后通过 ACK 回复和超时重发这两个机制来保证. 二.分析 TCP 协议是架设在 IP 协议之上的传输层协议,尽管 TCP 是以字节流的方式进行传输,但是其内部还是依 ...

  5. TCP\IP 数据流与数据包

    因为这段时间再看suricata的源码,然后发现自己对数据流与数据包的概念有点模糊,然后到网上去百度,发现网上的解释少得可怜,大多数都是一些名词解释,没什么收获,后来看多了也了解了一些,所以记录下来, ...

  6. Wireshark抓包分析TCP连接、发送数据与断开过程

    准备工具: 1. 两台连接到同个局域网的电脑,或者虚拟机; 2. 在其中一台电脑安装Wireshark; 3. 在两台电脑上面都有TCP&UDP测试工具软件 TCP连接建立过程(三次握手): ...

  7. TCP/IP 笔记 - 用户数据报协议和IP分片

    关于本章中的IP分片部分,参考第五章IP分片头部知识点.需要注意的是,TCP有超时重传,UDP的超时重传则依赖上层应用程序实现. 用户数据报协议(UDP) UDP是一个简单的面向无连接.不可靠的数据报 ...

  8. c语言tcp读写二进制文件,通过TCP/IP连接发送二进制文件

    Remy Lebeau.. 13 您需要循环发送和接收.既不保证send()也不recv()保证发送/读取您请求的字节数. 您还应该在文件数据之前发送文件大小,以便接收方知道预期的字节数和停止读取的时 ...

  9. Java 网络编程TCP协议之发送数据和接收数据的详解

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,

  10. TCP/IP协议基础

    1.TCP/IP协议栈 四层模型  TCP/IP这个协议遵守一个四层的模型概念:应用层.传输层.互联层和网络接口层. 网络接口层  模型的基层是网络接口层.负责数据帧的发送和接收,帧是独立的网络信息传 ...

最新文章

  1. C# 导出到Excel (使用NPOI 1.2.4)
  2. [高中作文赏析]假如真的有时光隧道
  3. 【mybatis基础】mybatis开发dao两种方法
  4. 中service层的作用_浅析Java中dto、dao、service、controller的四层结构
  5. PWA(Progressive Web App)入门系列:Notification
  6. 作者:窦勇(1966-),男,博士,国防科学技术大学并行与分布处理重点实验室常务副主任、研究员、博士生导师...
  7. 文件服务和对象存储服务器,对象存储与块存储服务
  8. 第三次冲刺--软件工程
  9. long 雪花算法_Snowflake 雪花算法
  10. Git XP 安装图解
  11. 网易云音乐 网络错误 linux,Linux版网易云音乐播放音乐时无限显示“网络错误”的解决办法...
  12. FPGA串口波特率计算方法
  13. 软件测试-正交实验法设计测试用例
  14. 16比9尺寸是多少厘米_16比9尺寸的长宽是多少像素
  15. 新能源车企骗补终结:实力说话淘汰赛开启
  16. D 语言编写CGI程序
  17. 今日头条用户搜索“室内设计”显示的自媒体粉丝数量及分布情况统计(2020.1.8)
  18. mmkv原理,Android多进程从头讲到尾,成功定级腾讯T3-2
  19. java ctor_.ctor,.cctor 以及 对象的构造过程
  20. 基于单片机的信号发生器设计

热门文章

  1. @Value(#{})与@Value(${})的区别
  2. SSM+Jedis初体验
  3. NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
  4. NSDate 时间戳与字符串转换
  5. winrar大全+压缩
  6. HQL左外连接及排序
  7. Centos中安装memcached
  8. oxygen版本eclipse使用Junit和spring静态工厂实例化bean的例子,出现java.lang.IllegalArgumentException异常。
  9. SpringBoot常见面试题总结二
  10. fullpage.js使用指南