#  Linux实例网站访问丢包延时高的排查方法

最近更新时间: 2020-08-13 19:15:14

# 概述

当网站访问很慢或无法访问时，若已经排除显著的问题，而使用ping命令检测到有明显丢包时，建议您做链路测试。Linux环境下，推荐优先使用mtr命令行工具测试，或使用traceroute命令行工具进行链路测试来判断问题来源。通常情况下，链路测试步骤如下。

  1. 利用链路测试工具探测网络状况和服务器状态。
  2. 根据链路测试结果分析处理。

# 详细信息

> 七牛云提醒您：
>
>   * 如果您对实例或数据有修改、变更等风险操作，务必注意实例的容灾、容错能力，确保数据安全。
>   * 如果您对实例（包括但不限于QVM、RDS）等进行配置与数据修改，建议提前创建快照或开启RDS日志备份等功能。
>   * 如果您在七牛云平台授权或者提交过登录账号、密码等安全信息，建议您及时修改。
>

如下分别介绍mtr命令行工具和tracert命令行工具的使用方法及如何分析链路测试结果。

## mtr命令行工具

mtr（My
traceroute）几乎是所有Linux发行版本预装的网络测试工具，集成了tracert与ping这两个命令的图形界面，功能十分强大。ping与tracert通常被用来检测网络状况和服务器状态，具体说明如下。

命令名称| 具体说明  
---|---  
ping| 送出封包到指定的服务器。如果服务器有回应就会传送回封包，并附带返回封包来回的时间。  
tracert| 返回从用户的电脑到指定的服务器中间经过的所有节点（路由）以及每个节点的回应速度。  
  
mtr默认发送ICMP数据包进行链路探测，通过“-u”参数指定UDP数据包用于探测。相对于traceroute只做一次链路跟踪测试，mtr会对链路上的相关节点做持续探测并给出相应的统计信息。mtr能避免节点波动对测试结果的影响，所以其测试结果更正确，建议优先使用。

### 用法说明

    
    
    mtr [-hvrctglspni46] [--help] [--version] [--report]  
               [--report-cycles=COUNT] [--curses] [--gtk]  
               [--raw] [--split] [--no-dns] [--address interface]  
               [--psize=bytes/-s bytes]  
               [--interval=SECONDS] HOSTNAME [PACKETSIZE]

### 示例输出

    
    
    [root@centos ~]# mtr 223.5.5.5  
    My traceroute [v0.75]  
    mycentos6.6 (0.0.0.0) Wed Jun 15 23:16:27 2016  
    Keys: Help Display mode Restart statistics Order of fields quit  
    Packets Pings  
    Host Loss% Snt Last Avg Best Wrst StDev  
    1. ???  
    2. 192.X.X.20 0.0% 7 13.1 5.6 2.1 14.7 5.7  
    3. 111.X.X.41 0.0% 7 3.0 99.2 2.7 632.1 235.4  
    4. 111.X.X.197 0.0% 7 1.8 2.0 1.2 2.9 0.6  
    5. 211.X.X.25 0.0% 6 0.9 4.7 0.9 13.9 5.8  
    6. 211.X.X.70 0.0% 6 1.8 22.8 1.8 50.8 23.6  
    211.X.X.134  
    211.X.X.2  
    211.X.X.66  
    7. 42.X.X.186 0.0% 6 1.4 1.6 1.3 1.8 0.2  
    42.X.X.198  
    8. 42.X.X.246 0.0% 6 2.8 2.9 2.6 3.2 0.2  
    42.X.X.242  
    9. ???  
    10. 223.5.5.5 0.0% 6 2.7 2.7 2.5 3.2 0.3

### 常见可选参数说明

  * -r或--report：以报告模式显示输出。
  * -p或--split：将每次追踪的结果分别列出来，而非--report统计整个结果。
  * -s或--psize：指定ping数据包的大小。
  * -n或--no-dns：不对IP地址做域名反解析。
  * -a或--address：设置发送数据包的IP地址。用于主机有多个IP的情况。
  * -4：只使用IPv4协议。
  * -6：只使用IPv6协议。

在mtr运行过程中，您也可以输入相应字母来快速切换模式，各字母的含义如下。

  * ?或h：显示帮助菜单。
  * d：切换显示模式。
  * n：切换启用或禁用DNS域名解析。
  * u：切换使用ICMP或UDP数据包进行探测。

### 返回结果说明

默认配置下，返回结果中各数据列的说明如下。

  * 第一列（Host）：节点IP地址和域名。按 **n** 键可切换显示。
  * 第二列（Loss%）：节点丢包率。
  * 第三列（Snt）：每秒发送数据包数。默认值是10，可以通过“-c”参数指定。
  * 第四列（Last）：最近一次的探测延迟。
  * 第五、六、七列（Avg、Best、Worst）：分别是探测延迟的平均值、最小值和最大值。
  * 第八列（StDev）：标准偏差。越大说明相应节点越不稳定。

## traceroute命令行工具

traceroute是几乎所有Linux发行版本预装的网络测试工具，用于跟踪Internet
协议（IP）数据包传送到目标地址时经过的路径。traceroute先发送最大存活时间值（Max_TTL）的UDP探测数据包，然后侦听从网关开始的整个链路上的ICMP
TIME_EXCEEDED响应。探测从TTL=1开始，TTL值逐步增加，直至接收到ICMP PORT_UNREACHABLE消息。ICMP
PORT_UNREACHABLE消息用于标识目标主机已经被定位，或命令已经达到允许跟踪的最大TTL值。traceroute默认发送UDP数据包进行链路探测。可以通过“-I”参数来指定发送ICMP数据包用于探测。

### 用法说明

    
    
    traceroute [-I] [ -m Max_ttl ] [ -n ] [ -p Port ] [ -q Nqueries ] [ -r ] [ -s SRC_Addr ] [  -t TypeOfService ] [ -f flow ] [ -v ] [  -w WaitTime ] Host [ PacketSize ]

### 示例输出

    
    
    [root@centos ~]# traceroute -I 223.5.5.5  
    traceroute to 223.5.5.5 (223.5.5.5), 30 hops max, 60 byte packets  
    1 __ _  
    2 192.X.X.20 (192.X.X.20) 3.965 ms 4.252 ms 4.531 ms  
     3 111.X.X.41 (111.X.X.41) 6.109 ms 6.574 ms 6.996 ms  
    4 111.X.X.197 (111.X.X.197) 2.407 ms 2.451 ms 2.533 ms  
    5 211.X.X.25 (211.X.X.25) 1.321 ms 1.285 ms 1.304 ms  
    6 211.X.X.70 (211.X.X.70) 2.417 ms 211.138.114.66 (211.X.X.66) 1.857 ms 211.X.X.70 (211.X.X.70) 2.002 ms  
    7 42.X.X.194 (42.X.X.194) 2.570 ms 2.536 ms 42.X.X.186 (42.X.X.186) 1.585 ms  
    8 42.X.X.246 (42.X.X.246) 2.706 ms 2.666 ms 2.437 ms  
    9 _ __  
     10 public1.alidns.com (223.5.5.5) 2.817 ms 2.676 ms 2.401 ms

### 常见可选参数说明

  * -d：使用Socket层级的排错功能。
  * -f：设置第一个检测数据包的存活数值TTL的大小。
  * -F：设置不要分段标识。
  * -g：设置来源路由网关，最多可设置8个。
  * -i：使用指定的网卡送出数据包。用于主机有多个网卡时。
  * -I：使用ICMP数据包替代UDP数据包进行探测。
  * -m：设置检测数据包的最大存活数值TTL的大小。
  * -n：直接使用IP地址而非主机名称（禁用DNS反查）。
  * -p：设置UDP传输协议的通信端口。
  * -r：忽略普通的Routing Table，直接将数据包送到远端主机上。
  * -s：设置本地主机送出数据包的IP地址。
  * -t：设置检测数据包的TOS数值。
  * -v：详细显示指令的执行过程。
  * -w：设置等待远端主机回包时间。
  * -x：开启或关闭数据包的正确性检验。

## 分析链路测试结果

以如下链路测试结果示例图为基础进行阐述。

![](http://qey2kbifv.hn-bkt.clouddn.com/2020-08-13/GPOqbvf6KTiBLMUdJZlk.png)

  1. 判断各区域是否存在异常，并根据各区域的情况分别处理。
     * 区域A：客户端本地网络，即本地局域网和本地网络提供商网络。针对该区域异常，客户端本地网络相关节点问题，请对本地网络进行排查分析。本地网络提供商网络相关节点问题，请向当地运营商反馈。

     * 区域B：运营商骨干网络。针对该区域异常，可根据异常节点IP查询归属运营商，然后直接或通过七牛云售后技术支持，向相应运营商反馈问题。

     * 区域C：目标服务器本地网络，即目标主机归属网络提供商网络。针对该区域异常，需要向目标主机归属网络提供商反馈问题。

  2. 结合Avg（平均值）和StDev（标准偏差），判断各节点是否存在异常。

     * 若StDev很高，则同步观察相应节点的Best和Worst，来判断相应节点是否存在异常。
     * 若StDev不高，则通过Avg来判断相应节点是否存在异常。

> **注意：**
> 上述StDev高或者不高，并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如，如果Avg为30ms，那么，当StDev为25ms，则认为是很高的偏差。而如果Avg为325ms，则同样的StDev为25ms，反而认为是不高的偏差。

  3. 查看节点丢包率，若“Loss%”不为零，则说明这一跳路由的网络可能存在问题。导致节点丢包的原因通常有两种。

     * 人为限制了节点的ICMP发送速率，导致丢包。
     * 节点确实存在异常，导致丢包。
  4. 确定当前异常节点的丢包原因。

     * 若随后节点均没有丢包，说明当前节点丢包是由于运营商策略限制所致，可以忽略。如前文链路测试结果示例图中的第2跳路由的网络所示。

     * 若随后节点也出现丢包，说明当前节点存在网络异常，导致丢包。如前文链路测试结果示例图中的第5跳路由的网络所示。

> **说明：**
> 前述两种情况可能同时发生，即相应节点既存在策略限速，又存在网络异常。对于这种情况，若当前节点及其后续节点连续出现丢包，而且各节点的丢包率不同，则通常以最后几跳路由的网络的丢包率为准。如前文链路测试结果示例图所示，在第5、6、7跳路由的网络均出现了丢包。所以，最终丢包情况，以第7跳路由的网络的40%作为参考。

  5. 通过查看是否有明显的延迟，来确认节点是否存在异常。通过如下两个方面进行分析。

     * 若某一跳路由的网络之后延迟明显陡增，则通常判断该节点存在网络异常。如前文链路测试结果示例图所示，从第5跳路由的网络之后的后续节点延迟明显陡增，则推断是第5跳路由的网络节点出现了网络异常。

> 注：高延迟并不一定完全意味着相应节点存在异常，延迟大也有可能是在数据回包链路中引发的，建议结合反向链路测试一并分析。

     * ICMP策略限速也可能会导致相应节点的延迟陡增，但后续节点通常会恢复正常。如前文链路测试结果示例图所示，第3跳路由的网络有100%的丢包率，同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。

## 操作建议

  * 若数据包在目标地址出现了100%的丢包，建议对目标服务器的安全策略配置进行排查。
  * 若数据包出现循环跳转，导致无法到达目标服务器，建议联系相应节点归属运营商处理。
  * 若数据包在跳转后无法收到任何反馈，建议结合反向链路测试做进一步确认，并联系相应节点归属运营商进行处理。
  * 七牛云中国内地机房和其他国家或地区机房有网络通信的专线，为降低通信时候的丢包率，推荐使用高速通道。
  * 若主机掉包和延迟非常高，建议做mtr双向测试，即本地到服务器的和服务器到本地的测试。无法远程登录时，请通过管理终端进行登录。

# 适用于

  * 云服务器 QVM