你如何诊断丢包?

我意识到这是非常主观的,并依赖于一些variables,但是我想知道当他们需要诊断给定系统上的数据包丢失时,大多数人会经历什么样的步骤?

我是一名networking工程师,所以我从我的angular度来描述这一点。

对我来说,诊断数据包丢失通常是以“工作不正常”开始的。 从那里,我通常试图find工具包尽可能靠近通信的两端(通常是一个办公室和一个服务器的工作站),尽可能接近另一端(理想的“远程端点”,但有时候有防火墙,我不能发送ping通,所以必须在路由器上设置一个LAN接口),看看是否能看到任何损失。

如果我可以看到损失,通常是一个“带宽不够”或“与问题链接”的情况,所以通过networkingfind路由并从中间开始,这通常会给你一端或另一端。

如果我看不到损失,接下来的两个步骤往往是“发更多的ping”或“发更大的ping”。 如果不能说明问题是什么,那么就应该从端点之间的整个path开始研究QoS策略和接口统计。

如果没有find任何东西,现在是时候开始质疑你的假设,你是否真的遭受了数据包丢失。 唯一可以确定的方法是在两端同时捕获,或者通过在主机上使用WireShark(或者等效的),或者通过networking连接来连接嗅探器(可能使用WireShark或类似的工具)。 然后来比较两个数据包捕获的乐趣…

有时,“数据包丢失”的原因只是服务器端的速度明显较慢(例如,将数据库从“在同一个局域网内”移动到“20毫秒之外”,并使用需要大量在前端和数据库之间来回)。

我将开始使用包捕获工具,如wireshark(在Windows上)和tcpdump(在Linuxterminal上)。

我也将检查防火墙configuration(主机防火墙以及networking防火墙)。

从Linux系统的angular度来看,我将首先使用ethtool -S ethX查找networking接口上的数据包丢失情况。

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

有时候中断不能平衡,因为系统缺lessirqbalance服务,所以查看chkconfig (EL)或update-rc (Debuntu)来查看这个服务是否正在运行。 您可以判断中断是否不平衡,因为/proc/interrupts将仅显示核心0服务于所有IRQ通道。

如果没有这个,你可能需要增加net.core.netdev_max_backlog如果系统超过了几个千兆的stream量,也许net.core.netdev_budget

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

如果在networking接口上没有丢包,请查看netstat -s并查看套接字缓冲区中是否有丢弃,这些报告将被统计为“ pruned from receive queue dropped from out-of-order queue ”和“ dropped from out-of-order queue ”。

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

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

就个人而言,我不喜欢协议卸载到网卡(校验和,分段卸载,大容量卸载),因为它似乎会造成比它的价值更大的麻烦。 使用ethtool -K这些设置可能是值得的。

查看网卡的模块选项( modinfo <drivername> ),因为您可能需要更改某些function。 举一个我遇到的例子,在一个处理一个大的TCPstream的系统上使用Intel的Flow Director可能会损害这个stream的效率,所以关掉FDir。

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

隔离,然后消除。

find问题的最小path子集。 通过testing不同的组合和/或提炼用户报告来做到这一点。 不要忘记把时间考虑在内。 也许这只是对所有到特定networking的stream量的丢包,或者只有无线客户端正在遭受损失。 考虑不同的stream量types(ping的速率限制)。 find最可靠,最容易重复的方法来testing它。

然后消除潜在的原因。 减less链路上的stream量(暂时),从频谱中移除干扰源,断开某些客户端。 最终你会发现问题的根源。

有时你可以通过查看包转储或者猜测(总是bittorrent)来做快捷方式。 另外,告诉你的教授serverfault真棒。