Linux 实例网站访问丢包延时高
背景介绍
当网站访问很慢或无法访问时,若已经排除显著的问题,而使用 ping
命令检测到有明显丢包时,建议做链路测试。Linux 环境下,推荐优先使用 mtr 命令行工具测试,或使用 traceroute 命令行工具进行链路测试来判断问题来源。通常情况下,链路测试步骤如下。
-
利用链路测试工具探测网络状况和服务器状态。
-
根据链路测试结果分析处理。
解决方法
WinMTR 工具
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 命令行工具
raceroute 是几乎所有 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 |
开启或关闭数据包的正确性检验。 |
分析链路测试结果
以如下链路测试结果示例图为基础进行阐述。
-
判断各区域是否存在异常,并根据各区域的情况分别处理。
-
区域 A:客户端本地网络,即本地局域网和本地网络提供商网络。针对该区域异常,客户端本地网络相关节点问题,请对本地网络进行排查分析。本地网络提供商网络相关节点问题,请向当地运营商反馈。
-
区域 B:运营商骨干网络。针对该区域异常,可根据异常节点 IP 查询归属运营商,然后直接或通过云平台售后技术支持,向相应运营商反馈问题。
-
区域 C:目标服务器本地网络,即目标主机归属网络提供商网络。针对该区域异常,需要向目标主机归属网络提供商反馈问题。
-
-
结合 Avg(平均值)和 StDev(标准偏差),判断各节点是否存在异常。
-
若 StDev 很高,则同步观察相应节点的 Best 和 Worst,来判断相应节点是否存在异常。
-
若 StDev 不高,则通过 Avg 来判断相应节点是否存在异常。
说明 上述 StDev 高或者不高,并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如,如果 Avg 为 30ms,那么,当 StDev 为 25ms,则认为是很高的偏差。而如果 Avg 为 325ms,则同样的 StDev 为 25ms,反而认为是不高的偏差。
-
-
查看节点丢包率,若
Loss%
不为零,则说明这一跳路由的网络可能存在问题。导致节点丢包的原因通常有两种。-
人为限制了节点的 ICMP 发送速率,导致丢包。
-
节点确实存在异常,导致丢包。
-
-
确定当前异常节点的丢包原因。
-
若随后节点均没有丢包,说明当前节点丢包是由于运营商策略限制所致,可以忽略。如前文链路测试结果示例图中的第 2 跳路由的网络所示。
-
若随后节点也出现丢包,说明当前节点存在网络异常,导致丢包。如前文链路测试结果示例图中的第 5 跳路由的网络所示。
说明 前述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,若当前节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳路由的网络的丢包率为准。如前文链路测试结果示例图所示,在第 5、6、7 跳路由的网络均出现了丢包。所以,最终丢包情况,以第 7 跳路由的网络的 40%作为参考。
-
-
通过查看是否有明显的延迟,来确认节点是否存在异常。通过如下两个方面进行分析。
-
若某一跳路由的网络之后延迟明显陡增,则通常判断该节点存在网络异常。如前文链路测试结果示例图所示,从第 5 跳路由的网络之后的后续节点延迟明显陡增,则推断是第 5 跳路由的网络节点出现了网络异常。
说明 高延迟并不一定完全意味着相应节点存在异常,延迟大也有可能是在数据回包链路中引发的,建议结合反向链路测试一并分析。
-
ICMP 策略限速也可能会导致相应节点的延迟陡增,但后续节点通常会恢复正常。如前文链路测试结果示例图所示,第 3 跳路由的网络有 100% 的丢包率,同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。
-
操作建议
-
若数据包在目标地址出现了 100% 的丢包,建议对目标服务器的安全策略配置进行排查。
-
若数据包出现循环跳转,导致无法到达目标服务器,建议联系相应节点归属运营商处理。
-
若数据包在跳转后无法收到任何反馈,建议结合反向链路测试做进一步确认,并联系相应节点归属运营商进行处理。
-
若主机掉包和延迟非常高,建议做 mtr 双向测试,即本地到服务器的和服务器到本地的测试。无法远程登录时,请通过管理终端进行登录。