如何对 rx_missed_errors 进行故障排除?

cuo*_*glm 8 linux linux-networking

从旧服务器迁移到新服务器,在设置所有服务后,我注意到我的 NIC 中有大量丢弃的 rx 数据包:

$ ifconfig eth2 | grep 'RX.*drop'
          RX packets:2059646370 errors:0 dropped:7142467 overruns:0 frame:0
Run Code Online (Sandbox Code Playgroud)

/sys/class/net/eth2/statistics/rx_dropped什么都不显示:

$ cat /sys/class/net/eth2/statistics/rx_dropped
0
Run Code Online (Sandbox Code Playgroud)

然后,我看到rx_missed_errors

$ cat /sys/class/net/eth2/statistics/rx_missed_errors
7142467
Run Code Online (Sandbox Code Playgroud)

如何排除故障并找出原因rx_missed_errors


我正在运行 Ubuntu 12.04.5 LTS,具有:

$ ethtool -i eth2
driver: ixgbe
version: 3.15.1-k
firmware-version: 0x800003e1
bus-info: 0000:07:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
Run Code Online (Sandbox Code Playgroud)

Chr*_*lan 8

大多数驱动程序交替使用计数器rx_missed_errorsrx_fifo_errorsrx_over_errors,但他们通常将这些计数器中的一个或多个设置为 MPC(丢失数据包计数)计数器,该计数器在数据包到达时递增,并且由于卡的 FIFO 队列已满而丢失。

这是 ixgbe 驱动程序的情况:

$ grep rx_missed_errors drivers/net/ixgbe/*
drivers/net/ixgbe/ixgbe_ethtool.c:      {"rx_missed_errors", IXGBE_STAT(net_stats.rx_missed_errors)},
drivers/net/ixgbe/ixgbe_main.c: adapter->net_stats.rx_missed_errors = total_mpc;
Run Code Online (Sandbox Code Playgroud)

所以rx_missed_errors对于 ixgbe 是 MPC。

英特尔网站上有一篇很棒的博客文章,用一个很好的比喻描述了 MPC 下降的原因:https : //communities.intel.com/community/tech/wired/blog/2009/11/04/how-the-kitchen -sink-and-statistics-explain-and-treat-dropped-packets

此外,请确保您的 NIC 和交换机之间没有速度和双工不匹配。如果您的交换机认为您的 NIC 比实际速度快,那么您将在 NIC 方面遇到问题。

最后,如果根本原因最终是面对突发时的性能,则最大化 NIC 环形缓冲区的大小可能会有所帮助。您可以使用 找到最大值ethtool -g eth2,然后使用 进行设置ethtool -G

  • 如果谷歌的缓存不起作用,它就在回程机器上:https://web.archive.org/web/20141220043139/https://communities.intel.com/community/wired/blog/2009/11/04 /厨房水槽和统计数据如何解释和处理丢弃的数据包 (2认同)