Linux 2.6.16 TCP连接速度异常的问题分析
来源:互联网 发布:three.js 柱状全景图 编辑:程序博客网 时间:2024/05/16 13:39
版权声明:本文由余子军原创文章,转载请注明出处:
文章原文链接:https://www.qcloud.com/community/article/104
来源:腾云阁 https://www.qcloud.com/community
发现访问公司某些业务时,速度非常不稳定,并且整体慢于竞争对手。分析认为SESU10母盘上内核TCP拥塞控制算法和Windows的Ack频率控制的策略存在不兼容情况。
目前至少确认 2.6.16内核版本存在此问题;打TCP优化补丁或者更换Tlinux以后可以解决问题。
问题现象:
在体验网环境下测试:大文件下载的情况下,百度的下载速度平均在600KBPS,我们的下载速度平均低于100Kbps;互娱Webgame情况下,TNT业务下载速度大约是DDT的25%。
这里是一个典型的下载速度曲线:
我们的服务器的曲线:(纵轴单位:包/s)
百度的服务器下载的曲线:
重现该问题的测试环境:
网络: 公司体验网,普通联通4M ADSL
服务器:Linux64位服务器, 深圳机房。
服务器程序: Apache,nws(自研webserver)
客户端: Windows XP, Windows7,任意浏览器或者旋风(单线程下载)
测试工具:wireshark, httpwatch
测试连接:分别是自建CDN、百度下载、深圳DC+Apache
问题分析:
通过客户端抓包分析发现速度很慢的段有两个问题:
服务器端总是等到前面的数据包确认以后才发送第二个包
Windows总是等到200ms左右才发送ACK确认。
对于Windows端的行为, 为了防止ACK过多导致网络压力,Ms TCP协议栈在每收到一个数据包时,启动一个200ms定时器,直到收到其他数据包或者定时器过期时才发送ACK包。
通过设置注册表选项 TcpAckFrequency 参数为1关闭 Ack delay以后,实验发现下载速度恢复正常,无法重现下载速度慢的问题。
To configure the max outstanding ACKs in Windows XP/2003/Vista/2008:
[HKEYLOCALMACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}]
TcpAckFrequency = 1 (Default=2, 1=Disables delayed ACK, 2-n = If n outstanding ACKs before timed interval, sent ACK)
因为无法强制用户通过修改注册表避免问题,并且竞争对手也没有看到类似问题,因此只能从linux端解决。
Linux这一端,首先怀疑和nagle算法有关系,在nws服务器上设置TCP_NODELAY以后仍然可以重现,可以排除Nagle算法的影响。 (实际上nws每次发送大数据包或者直接使用sendfile,不太会收到nagle算法影响) 其次Apache,nws都可以重现这个问题,比较怀疑操作系统本身有缺陷。
因为每次linux仅发送一个数据包,因此怀疑拥塞窗口的问题,推测问题如下:
初始情况下,客户端回复一个ACK时,拥塞窗口增大,每次发送多个数据包,因此刚开始可以有较快的传输速度;因为网络延时抖动或丢包导致服务器协议栈判定数据包超时,重置拥塞窗口为1,每次仅发送一个数据包,收到客户端200ms回包,时仍然认为超时,同时调整RTT;直到RTT增大到200ms不算超时为止,拥塞窗口得以扩大,可以发送多个数据包,传输速度增快,如此循环。
通过测试增大初始拥塞窗口为10 (更换内核加载架平新技术组的TCP优化模块实现),下载速度恢复正常。
附旋风测试选项:
参考:
http://smallvoid.com/article/winnt-nagle-algorithm.html
http://support.microsoft.com/kb/214397/en-us
- Linux 2.6.16 TCP连接速度异常的问题分析
- 针对TCP连接异常断开的分析
- 针对TCP连接异常断开的分析
- TCP连接异常终止分析
- linux显示单个tcp连接速度脚本
- 查看每个TCP连接的速度
- TCP连接一异常现象分析
- TCP连接异常分析与RST
- 解决linux ftp连接速度慢的问题!
- 解决linux ftp连接速度慢的问题!
- linux ssh 连接速度很慢的问题
- 提高TCP并发连接数和连接速度的方法
- linux下显示网络流量/tcp连接速度命令
- linux tcp 长连接保活的问题
- TCP连接异常断开的检测
- TCP连接异常断开的检测
- tcp连接失败触发的异常
- Linux 下TCP连接关闭情况分析
- 输入法人机交互评价
- 咸鱼了很久之后的牢骚篇
- 深度探索C++对象模型(七)站在对象模型的尖端
- python学习笔记 迭代和列表生成式
- 我的第一篇blog
- Linux 2.6.16 TCP连接速度异常的问题分析
- 树莓派系列教程【一】:开启root权限
- Qt之XML(DOM)
- 【计算机基础】计算机硬件系统(一)
- Ubuntu JDK
- Linux grep find命令
- win10的mysql服务无法启动的解决方式
- android基础_第二天
- linux ssh安装和配置