您如何诊断丢包?


27

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


什么是“系统”?您是说您有一台服务器(或台式机)遇到丢包情况吗?还是整个网段?您如何将其诊断为数据包丢失(我假设您的意思是网络造成的),而不是例如应用程序服务器上的性能不佳,瞬态端口或Java堆耗尽或其他百万种可能?
mfinni 2010年

我意识到这是一个不好的问题描述。认为它纯粹是学术性和假设性的。假设这是丢包,只是想知道大多数工程师采取了什么步骤。
KushalP,2010年

Answers:


29

我是网络工程师,所以我将从我的角度进行描述。

对我来说,诊断数据包丢失通常始于“效果不佳”。从那里,我通常会尝试找到尽可能靠近通讯两端(通常是办公室中的工作站和某个地方的服务器)的工具包,并在尽可能靠近另一端的位置(最好是“远程端点”)进行ping操作,但是有时有些防火墙我无法通过ping发送信息,因此必须在路由器上安装LAN接口),看看是否能看到任何丢失。

如果我看到丢失的情况,通常是“带宽不足”或“问题之间存在链接”的情况,因此找到通过网络的路由并从中间开始,这通常会给您提供另一端的服务。

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

如果找不到任何东西,那么该开始质疑您的假设了,您实际上是否遭受了丢包的困扰。唯一确定的发现方法是在两端同时进行捕获,方法是在主机上使用WireShark(或等效方法),或者通过网络分流器连接嗅探器机器(可能使用WireShark或类似工具)。然后是比较两个数据包捕获的乐趣...

有时,被称为“数据包丢失”的原因仅仅是服务器端的速度明显变慢(例如,将数据库从“在同一LAN上”移动到“ 20毫秒外”,并使用需要大量操作的查询)在前端和数据库之间来回移动)。


+1。Beeing一个客户支持网络工程师,我通常也遵循这条路径。
petrus

1
@Vatine最好有一些代码示例,以便能够在无需搜索命令和选项的情况下进行练习……
Philippe Gachoud

11

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

大多数时候,通过增加环形缓冲区可以ethtool -G ethX rx VALUE解决此问题。

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

失败的话,net.core.netdev_max_backlog如果系统传递的流量超过几GB,则可能需要增加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流的系统上使用Intel的Flow Director可能会损害该流的效率,因此请关闭FDir。

除此之外,您还需要针对特定​​的工作量手动调整该特定的系统,我想这超出了您的问题范围。


4

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

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


3

隔离,然后消除。

找到出现问题的最小路径子集。为此,请测试不同的组合和/或提取用户报告。不要忘记将时间放在equasion中。也许这只是到特定网络的所有流量上的丢包,或者也许只有无线客户端正在遭受损失。考虑不同的流量类型(ping的速率限制)。寻找最可靠,最容易重复的方式进行测试。

然后消除潜在原因。(暂时)减少链路上的流量,从频谱中消除干扰源,断开某些客户端的连接。最终,您将找到问题的根源。

有时您可以通过查看数据包转储或猜测来获得捷径(它总是bittorrent)。另外,告诉您的教授serverfault很棒。


它是“消除”而不是“消除”。
Andrew Smith

0

除非您发送大的ping,否则ping可能不会显示出数据包丢失!在增加ping数据包大小之前,我的网络上的数据包丢失是不可见的。

对于Windows:

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

对于largevalue我用40960(40K数据包)

因为target我使用了前几个IP地址tracert google.com

(这是我的路由器和电缆调制解调器)。链中更下游的设备之一对于大数据包而言,丢包率非常高(> 60%),而对于小数据包而言则为0%。我通过重新启动来修复它,但是它也可能是电缆或内部需要更换的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.