如何诊断数据包丢失?

如何诊断数据包丢失?

我意识到这是非常主观的并且取决于许多变量,但我想知道大多数人在需要诊断给定系统上的数据包丢失时会经历哪些步骤?

答案1

我是一名网络工程师,所以我将从我的角度来描述这一点。

对我来说,诊断数据包丢失通常从“它工作得不太好”开始。从那里,我通常会尝试找到距离通信两端尽可能近的设备(通常是办公室中的工作站和某处的服务器),并尽可能靠近另一端执行 ping 操作(理想情况下是“远程端点”,但有时我无法通过防火墙发送 ping,因此必须使用路由器上的 LAN 接口),看看是否可以看到任何丢失。

如果我看到损失,通常是由于“带宽不足”或“链接有问题”的情况,因此找到通过网络的路由并从中间开始,这样通常会给你一端或另一端。

如果我看不到丢失,接下来的两个步骤通常是“发送更多 ping”或“发送更大的 ping”。如果这不能表明问题所在,那么是时候开始查看端点之间整个路径的 QoS 策略和接口统计信息了。

如果这样没有发现任何结果,那么是时候开始质疑你的假设了,你真的遭受了数据包丢失吗?唯一可靠的方法是同时在两端进行捕获,要么在主机上使用 WireShark(或等效程序),要么通过网络分路器连接嗅探器机器(可能使用 WireShark 或类似程序)。然后就是比较两个数据包捕获的乐趣了……

有时,所谓的“数据包丢失”仅仅是服务器端的某些事情明显变慢(例如,将数据库从“同一个 LAN 上”移动到“20 毫秒之外”,并使用需要在前端和数据库之间进行大量来回传输的查询)。

答案2

从 Linux 系统的角度来看,我首先会使用 查找网络接口上的数据包丢失ethtool -S ethX

大多数情况下,增加环形缓冲区可以ethtool -G ethX rx VALUE解决这个问题。

有时中断不平衡是因为系统缺少 irqbalance 服务,因此请查看chkconfig(EL) 或update-rc(Debuntu) 以查看此服务是否正在运行。您可以判断中断是否不平衡,因为/proc/interrupts将显示只有核心 0 为所有 IRQ 通道提供服务。

net.core.netdev_max_backlog除此之外,如果系统传输的流量超过几千兆位,则可能需要增加,也许net.core.netdev_budget

如果这不起作用,您可以使用来调整中断合并值ethtool -C

如果网络接口上没有数据包丢失,请查看netstat -s套接字缓冲区中是否有数据包丢失,这些数据包将以“ pruned from receive queue”和“ dropped from out-of-order queue”等统计信息进行报告。

net.ipv4.tcp_rmem您可以尝试增加适当协议(例如: TCP)的默认和最大套接字缓冲区。

如果应用程序设置了自己的套接字缓冲区大小,则应用程序可能需要更改配置。如果您的应用程序有硬编码的套接字缓冲区大小,请向您的应用程序供应商投诉。

我个人不喜欢将协议卸载到 NIC(校验和、分段卸载、大型接收卸载),因为它似乎会带来比它本身更多的麻烦。尝试使用这些设置ethtool -K可能值得一试。

查看 NIC 的模块选项(modinfo <drivername>),因为您可能需要更改某些功能。举一个我遇到的例子,在处理一个大型 TCP 流的系统上使用英特尔的 Flow Director 可能会损害该流的效率,因此请关闭 FDir。

除此之外,您还需要手动调整该特定系统以适应其特定的工作负载,我想这超出了您的问题范围。

答案3

我将首先使用数据包捕获工具,例如:wireshark(在 Windows 上)和 tcpdump(在 Linux 终端上)。

我还将检查防火墙配置(主机防火墙以及网络防火墙)。

答案4

除非您发送较大的 ping,否则 ping 可能不会显示数据包丢失!我的网络出现数据包丢失,但直到我增加 ping 数据包大小后才发现。

对于 Windows:

ping -n 30 -l <largevalue> <target>

largevalue使用了 40960(40k 数据包)

因为target我使用了来自tracert google.com

(即我的路由器和电缆调制解调器)。链中较下方的其中一个设备大数据包丢失率非常高(>60%),但小数据包丢失率为 0%。我通过重启解决了这个问题,但也可能是电缆或内部设备需要更换。

相关内容