论坛首页 Java企业应用论坛

网络编程中Nagle算法和Delayed ACK的测试

浏览 17635 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-07-01  
dennis_zane 写道
没啥人关注啊,我写了一下午的

主要是看的头大,知识有限啊。给楼主顶顶。
0 请登录后投票
   发表时间:2011-07-01  
agapple 写道
dennis_zane 写道
agapple 写道
多学习了一点内容,以前还不知道有delay ack这回事。

有个问题:在memcached协议里,对应的cmd都是一次请求request出去。不知道在xmemcached会出现head,body的情况?

还有一个,就是比较关心LZ是怎么发现这个问题原因?貌似是个性能改进点,并不会造成功能不可用。要发现这个问题,可得下不少功夫,蹲点tcpdump?


首先是xmemcached不会有这种问题,它都是搞成一个缓冲区来发送的,也没有用writev。
其次,这个问题过去一直都有存在,都是简单地设置nagle算法来解决。最近回去看了些tcp/ip的资料(tcp/ip协议卷一),发现这样解决不是最好和唯一的办法。


可能在memcached client这样的场景下也许不会出现这样的情况。 nio每次的write都操作一个sendBuffer,如果一次flush不能完全输出,还是会出现的write-write情况,写类似的server,比如大文本数据下载,大数据量的rpc请求服务,就得注意LZ提的场景。

不过看了下目前公司的几个socket操作的包,基本都是Nagle=false的为多。


一次write不完的情况,可以说是发送缓冲区已经满了,没有可用空间继续发送,但是缓冲区里的数据是可以继续发出去的,nagle算法只针对小数据,这种情况nagle算法是不起作用的,继续放行。你看nagle算法的wiki描述就知道了。
0 请登录后投票
   发表时间:2011-07-01  
rain2005 写道
还有个疑问,在一个web应用里面,既存在小数据量得http请求,也存在大数据量的文件上传,第二种情况write不能合并,服务器也不会马上响应,那这种情况怎么解决?当前的nginx,tomcat等服务器是怎么做的呢?


请看nagle算法的伪代码

if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if

当发送窗口大于MSS并且可发送数据的大小也大于MSS(最大分段大小,以太网通常是1460),那么会继续发送一个MSS大小的分段,nagle算法是不起作用的。
0 请登录后投票
   发表时间:2011-07-01  
ustcter 写道
文章太长,只看了一半。

不过有个疑问,TCP是有捎带ACK。但是绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。

你在本机测试时RTT很小觉得有阻塞,但是200ms对于网络传输来说并不是很大吧。


200ms还不大? 200ms意味着你发送一个1字节的消息,单线程来发一秒只能发5个左右,这个tps绝对无法接受。

你要知道,在千兆网络上传输1M数据通常也只需要10毫秒。
0 请登录后投票
   发表时间:2011-07-01  
分析的很到位!给投精华了


tcp/ip协议卷一 还在继续看着 ^-^
0 请登录后投票
   发表时间:2011-07-01  
事实上TCP协议栈决定能不能继续发送数据取决于很多因素,下面是个可能的考虑列表

(1)可以发送一段完整的MSS尺寸段
(2)连接空闲,并且可以清空发送缓冲区
(3)Nagle算法被禁止,并且可以清空发送缓冲区
(4)有紧急数据需要发送
(5)有一小段“暂时”无法发送的数据
(6)对等实体的接收窗口至少是半开的
(7)需要重传一个段
(8)需要为来自对等实体的数据回送一个ACK
(9)需要发布一次窗口更新
0 请登录后投票
   发表时间:2011-07-01  
真是学习了,看来要重新看tcp/ip详解了
0 请登录后投票
   发表时间:2011-07-01  
mark

上班中,休息中慢慢看
0 请登录后投票
   发表时间:2011-07-01  
正如楼主(dennis_zane) 所说的那样。 特别是最后一段总结。 这个东西最好多使用实际数据测试服务器与客户端之间的通讯, 已达到最好的性能。

TCP/IP 协议这个一定是要看的,最好买一本常放在旁边, 方便查阅。不过这本书比较老,很多东西也没提到, 可以多看看书以外的一些资料。

0 请登录后投票
   发表时间:2011-07-01  
ustcter 写道
文章太长,只看了一半。

不过有个疑问,TCP是有捎带ACK。但是绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。

你在本机测试时RTT很小觉得有阻塞,但是200ms对于网络传输来说并不是很大吧。


对于hello world这样的小数据 本身来回一次都是0.0 几个ms
200ms  可以说是比天还大了 
0 请登录后投票
论坛首页 Java企业应用版

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