文档章节

Linux 2.6.16 TCP连接速度异常的问题分析

偶素浅小浅
 偶素浅小浅
发布于 2016/10/31 12:58
字数 936
阅读 21
收藏 0

版权声明:本文由余子军原创文章,转载请注明出处: 
文章原文链接: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

问题分析:

通过客户端抓包分析发现速度很慢的段有两个问题:

  1. 服务器端总是等到前面的数据包确认以后才发送第二个包

  2. 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

本文转载自:

偶素浅小浅
粉丝 8
博文 202
码字总数 0
作品 0
信阳
私信 提问
Ubuntu 上 redis2.6.16部署

redis安装日志 1、问题一、vmvare中网络连接不上?答:原因是主机上vmware的服务没有开启。开启服务后,在主机ping虚拟机不通,将虚拟机的网卡切换到与主机同一网段上 2、Ubuntu中右键(桌面...

乔康007
2015/04/13
70
0
TCP异常关闭研究分析

版权声明:本文由谢代斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qcloud.com/community 研究测试TCP断开和异常的各...

偶素浅小浅
2016/11/02
91
0
【原创】抓包分析之 “TCP Previous segment not captured”

前两天遇到了这样一个奇怪的现象:向某个服务发起 HTTP 请求,会概率性的出现丢包现象; 抓包截图如下: 在正常情况下,服务器在接收到 HTTP 请求后会迅速进行回应;并且 TCP 连接关闭是客户...

摩云飞
2016/12/12
12.1K
0
[Jmeter]日常工作中踩的坑

[JMeter] Error in rconfigure() method java.rmi.ConnectException:Connection refused to host 问题分析:抛出的问题中,提示Java远程调用方法出现了异常,连接拒绝了master,可能是主机与奴...

覃光林
05/24
197
0
Linux OS||不响应SYN总结

背景 对外提供TCP服务的进程,在压测时发现,TCP连接SYN响应慢,甚至不响应。导致无法正常接收新的请求,影响业务。 抓包分析: 如上有大量的重传,有时能够正常的响应请求,有时就无法响应请...

枫凡
2017/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
29分钟前
4
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
32分钟前
4
0
C++容器底层数据结构

内置数组: int arr[10][10];memset(arr,0,10*10*sizeof(int)); //初始化int tmp[10][10];memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝 void *memcpy(void *destin, void *source,......

SibylY
32分钟前
3
0
Dubbo-自适应拓展机制

背景 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等,这些都是Dubbo的基础组件。这些基础组件的拓展不是在系统框架启动阶段被加载,而是拓展方...

rock-man
今天
7
0
Kali安装fcitx输入法(五笔)

安装fcitx > sudo apt-get install fcitx-rime fcitx-config-gtk3 重启 > sudo reboot fcitx配置 效果就是这样 配置输入法切换 系统设置...

yeahlife
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部