tcp_nodelay memcached java_spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据
先说一下结论。
那么默认 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延迟发送数据相关推荐
- spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据
先说一下结论. 如果你没有特意在 spymemcached 的 client bean definition 里配置 useNagleAlgorithm 属性为 True, 那么默认 spymemca ...
- gprs模块发送html,GPRS模块通过TCP/IP方式发送数据流程
首先介绍一下GPRS的接入方式,在中国有CMWAP和CMNET两种方式.CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式.前者是为手机WAP上网而设立的,后者则主要是为PC.笔记 ...
- ip fragmentation_为什么 TCP/IP 协议会拆分数据
来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-segment-ip-packet/ 为什么这么设计(Why's THE Design ...
- TCP/IP / 如何保证数据包传输的有序可靠?
一.答案 对字节流分段并进行编号然后通过 ACK 回复和超时重发这两个机制来保证. 二.分析 TCP 协议是架设在 IP 协议之上的传输层协议,尽管 TCP 是以字节流的方式进行传输,但是其内部还是依 ...
- TCP\IP 数据流与数据包
因为这段时间再看suricata的源码,然后发现自己对数据流与数据包的概念有点模糊,然后到网上去百度,发现网上的解释少得可怜,大多数都是一些名词解释,没什么收获,后来看多了也了解了一些,所以记录下来, ...
- Wireshark抓包分析TCP连接、发送数据与断开过程
准备工具: 1. 两台连接到同个局域网的电脑,或者虚拟机; 2. 在其中一台电脑安装Wireshark; 3. 在两台电脑上面都有TCP&UDP测试工具软件 TCP连接建立过程(三次握手): ...
- TCP/IP 笔记 - 用户数据报协议和IP分片
关于本章中的IP分片部分,参考第五章IP分片头部知识点.需要注意的是,TCP有超时重传,UDP的超时重传则依赖上层应用程序实现. 用户数据报协议(UDP) UDP是一个简单的面向无连接.不可靠的数据报 ...
- c语言tcp读写二进制文件,通过TCP/IP连接发送二进制文件
Remy Lebeau.. 13 您需要循环发送和接收.既不保证send()也不recv()保证发送/读取您请求的字节数. 您还应该在文件数据之前发送文件大小,以便接收方知道预期的字节数和停止读取的时 ...
- Java 网络编程TCP协议之发送数据和接收数据的详解
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
- TCP/IP协议基础
1.TCP/IP协议栈 四层模型 TCP/IP这个协议遵守一个四层的模型概念:应用层.传输层.互联层和网络接口层. 网络接口层 模型的基层是网络接口层.负责数据帧的发送和接收,帧是独立的网络信息传 ...
最新文章
- C# 导出到Excel (使用NPOI 1.2.4)
- [高中作文赏析]假如真的有时光隧道
- 【mybatis基础】mybatis开发dao两种方法
- 中service层的作用_浅析Java中dto、dao、service、controller的四层结构
- PWA(Progressive Web App)入门系列:Notification
- 作者:窦勇(1966-),男,博士,国防科学技术大学并行与分布处理重点实验室常务副主任、研究员、博士生导师...
- 文件服务和对象存储服务器,对象存储与块存储服务
- 第三次冲刺--软件工程
- long 雪花算法_Snowflake 雪花算法
- Git XP 安装图解
- 网易云音乐 网络错误 linux,Linux版网易云音乐播放音乐时无限显示“网络错误”的解决办法...
- FPGA串口波特率计算方法
- 软件测试-正交实验法设计测试用例
- 16比9尺寸是多少厘米_16比9尺寸的长宽是多少像素
- 新能源车企骗补终结:实力说话淘汰赛开启
- D 语言编写CGI程序
- 今日头条用户搜索“室内设计”显示的自媒体粉丝数量及分布情况统计(2020.1.8)
- mmkv原理,Android多进程从头讲到尾,成功定级腾讯T3-2
- java ctor_.ctor,.cctor 以及 对象的构造过程
- 基于单片机的信号发生器设计
热门文章
- @Value(#{})与@Value(${})的区别
- SSM+Jedis初体验
- NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
- NSDate 时间戳与字符串转换
- winrar大全+压缩
- HQL左外连接及排序
- Centos中安装memcached
- oxygen版本eclipse使用Junit和spring静态工厂实例化bean的例子,出现java.lang.IllegalArgumentException异常。
- SpringBoot常见面试题总结二
- fullpage.js使用指南