阅读1007 返回首页    go 微软 go windows


ECS资源下载慢 ,如何分析定位?

af19567fcf194c439fa0c5cf6cf0aafeb4a9d694

问题背景

4月中旬,收到某用户反馈,从华北2地域的ECS下载华东1的ECS上的资源,下载速度被限制为2M,此问题会对用户的业务产生极大的影响,涉及到企业的大量业务订单,问题非常紧急。收到用户反馈后我们立即根据现有的情况进行分析。

分析思路

下载速度的影响因素有哪些?

1、网络延迟;

2、客户端&服务端的出入带宽限制;

3、运营商中间链路限制(有些情况下就算ping延迟低,但也可能看到TCP或UDP协议的传输过程中被运营商认为的加入延迟来限速);

4、客户端的多线程行为;

5、服务端和客户端的OS层面的TCP协议层面的接受发送窗口(Auto Tuning)的相关配置,Selective ACK协议的行为;

注:

TCP协议层面的接受发送窗口(Auto Tuning)的相关配置,如下:

TCP 滑动窗口(TCP Windowing)大小,窗口缩放因子(Window Scaling)的值。

分析过程

测试网络延迟

华东1与华北2之间互ping延迟为30ms左右。

Jietu20170504-135739.jpg?version=1&modif

检查带宽限制

检查有2端的ECS的出入带宽均没有到达上限。

测试使用多线程下载

问题是ECS限制了2M的下载速度,为了佐证ECS下载速度没有限制,测试使用mwget,多线程下载工具下载,轻松跑到30M左右。

说明ECS本身网络是没有限制的。

抓包分析报文

三次握手的过程如下(下图为Server的抓包)

这里也走了一些歪路 ,查看ACK的的交互有30ms左右的延迟,就定位为延迟导致的网络延迟。

如在报文完整的传输过程中,可以看到每隔30-50个报文就会出现延迟30ms的情况。

但是我们进行了对比测试,从上海,深圳等测试,

如:ping延迟小的情况下,有出现下载慢,而ping延迟大,有出现下载快的情况。于是思考延迟只是这个问题出现的一方面的原因。故继续分析报文。

Jietu20170504-140739.jpg?version=1&modif

考虑是否有网络限速的可能

查看报文出现30ms左右延迟的报文,均是ACK的报文。不太像网络限速。

Jietu20170504-141048.jpg?version=1&modifJietu20170504-141009.jpg?version=1&modif

TCP 参数检查

如上,单线程最多能够下载2M左右,但是多线程能够跑很高;判断可能是TCP参数导致的问题。

多线程与单线程下载的区别是:

多线程是使用多个TCP流进行下载。

而单线程只有一个TCP流。

从这个角度分析TCP 三次握手信息:

SYN:

Jietu20170504-141745.jpg?version=1&modif
SYN,ACK
Jietu20170504-141720.jpg?version=1&modif

ACK

Jietu20170504-141828.jpg?version=1&modif

三次握手完成后的结果为:没有启动窗口缩放功能。

window滑动窗口的大小是固定的。

查看系统配置:

cat /proc/sys/net/ipv4/tcp_window_scaling

查看确实没有开启。

Jietu20170504-142200.jpg?version=1&modif
输入:

echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

修改为1后下载能够上升到20-30M左右,符合预期。

Jietu20170504-142238.jpg?version=1&modif

总结

1、如分析思路中描述的内容,影响下载速度的因素有很多,在定位时需要全部的内容都分析,然后找到最影响传输速度的项,针对性的进行优化。

2、本案例中需要了解:TCP 滑动窗口(TCP Windowing)、窗口缩放因子(Window Scaling)这2个概念的含义。

注意:TCP Window Scaling仅在TCP连接的双方都开启时才真正有效

3、这个案例的原因为没有开启Window Scaling导致传输速度不理想,属于TCP传输优化内容。

最后更新:2017-05-04 15:07:42

  上一篇:go JavaScript 保留关键字总结
  下一篇:go Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用