我意识到这是非常主观的,并且取决于许多变量,但是我想知道大多数人在需要诊断给定系统上的数据包丢失时需要经过哪些步骤?
我意识到这是非常主观的,并且取决于许多变量,但是我想知道大多数人在需要诊断给定系统上的数据包丢失时需要经过哪些步骤?
Answers:
我是网络工程师,所以我将从我的角度进行描述。
对我来说,诊断数据包丢失通常始于“效果不佳”。从那里,我通常会尝试找到尽可能靠近通讯两端(通常是办公室中的工作站和某个地方的服务器)的工具包,并在尽可能靠近另一端的位置(最好是“远程端点”)进行ping操作,但是有时有些防火墙我无法通过ping发送信息,因此必须在路由器上安装LAN接口),看看是否能看到任何丢失。
如果我看到丢失的情况,通常是“带宽不足”或“问题之间存在链接”的情况,因此找到通过网络的路由并从中间开始,这通常会给您提供另一端的服务。
如果看不到损失,接下来的两个步骤通常是“发送更多的ping”或“发送更大的ping”。如果这还不能说明问题所在,那么该是时候通过端点之间的整个路径来查看QoS策略和接口统计信息的时候了。
如果找不到任何东西,那么该开始质疑您的假设了,您实际上是否遭受了丢包的困扰。唯一确定的发现方法是在两端同时进行捕获,方法是在主机上使用WireShark(或等效方法),或者通过网络分流器连接嗅探器机器(可能使用WireShark或类似工具)。然后是比较两个数据包捕获的乐趣...
有时,被称为“数据包丢失”的原因仅仅是服务器端的速度明显变慢(例如,将数据库从“在同一LAN上”移动到“ 20毫秒外”,并使用需要大量操作的查询)在前端和数据库之间来回移动)。
从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。
除此之外,您还需要针对特定的工作量手动调整该特定的系统,我想这超出了您的问题范围。
隔离,然后消除。
找到出现问题的最小路径子集。为此,请测试不同的组合和/或提取用户报告。不要忘记将时间放在equasion中。也许这只是到特定网络的所有流量上的丢包,或者也许只有无线客户端正在遭受损失。考虑不同的流量类型(ping的速率限制)。寻找最可靠,最容易重复的方式进行测试。
然后消除潜在原因。(暂时)减少链路上的流量,从频谱中消除干扰源,断开某些客户端的连接。最终,您将找到问题的根源。
有时您可以通过查看数据包转储或猜测来获得捷径(它总是bittorrent)。另外,告诉您的教授serverfault很棒。