你如何诊断数据包丢失?

Kus*_*alP 37 packetloss packet best-practices

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

Vat*_*ine 34

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

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

如果我能看到丢失,通常是“带宽不足”或“有问题的链接”介于两者之间,因此找到通过网络的路由并从中间开始,这通常会为您提供一端或另一端。

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

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

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


sup*_*ami 19

从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。

除此之外,您正在针对特定工作负载手动调整此特定系统,我想这超出了您的问题范围。