从旧服务器迁移到新服务器,设置完所有服务后,我注意到我的网卡中丢弃了大量 rx 数据包:
$ ifconfig eth2 | grep 'RX.*drop'
RX packets:2059646370 errors:0 dropped:7142467 overruns:0 frame:0
但/sys/class/net/eth2/statistics/rx_dropped
不显示任何内容:
$ cat /sys/class/net/eth2/statistics/rx_dropped
0
然后,我看到rx_missed_errors
:
$ cat /sys/class/net/eth2/statistics/rx_missed_errors
7142467
我该如何排除故障并找出原因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
答案1
大多数驱动程序会交替使用计数器rx_missed_errors
、rx_fifo_errors
和rx_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;
所以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
。