TCP层性能优化:nagles算法与延迟ack共同工作导致的一次性能下降

在实现数据库redis代理时,发现开启pipeline功能后,性能从1.7k ops骤降至70 ops。通过wireshark抓包分析,发现在TCP层存在40ms的莫名暂停。研究发现,这是Nagle算法与延迟ACK策略相互作用的结果。服务器等待ACK,客户端延迟40ms发送ACK,导致传输阻塞。解决方法在于调整TCP设置,避免此类性能下降。
摘要由CSDN通过智能技术生成

问题发现,莫名其妙的暂停

最近因为工作原因,给一个数据库写了一个redis代理,将redis请求转换成该数据库的请求,然后丢到数据库去。


该数据库本身在我的虚拟机上跑,读写性能应该在2k ops的样子。


然后神奇的事情出现了,我开始跑redis-benchmark工具,不开启redis pipeline功能,ops大概在1.7k,一旦开启pipeline,以3个请求一个pipeline丢请求过去,ops一下下降到了70上下。难道我针对pipeline做的处理出问题了?

于是启动wireshark,抓了一下包,看tcp流,数据都是对的。但是看请求时间,确实一秒只做了70个请求上下。那就很有意思了。这个时候,只能仔细观察数据包,看看延迟具体是多少了。于是我就注意到了以下这个包:




可以看到,从36.86s到35.91s之间,传输莫名其妙停止了40ms。我仔细确认了暂停传输前后的包,传输顺序如下:


  1. 客户端向代理发起请求,请求包括三个set请求
  2. 服务器端返回一个set的响应,ok,同时附带对刚才请求的ack
  3. 停顿40ms
  4. 客户端发送了一个ack
  5. 服务器返回两个set的响应,即两个ok。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值