记 Intel 82574L 网卡的断流问题处理 CentOS 6
最近在一台服务器上处理包过滤的程序,服务器上集成了6块 Intel 82574L 的千兆网卡,这块网卡出来的比较早,性能也比较均衡,很多服务器设备上也有集成。包过滤程序使用了pf_ring作为抓包的模块,操作系统使用的是CentOS 6.9,内核是2.6.32版本。在测试的时候发现几次很异常的情况,抓包一段时间以后(时长不定),被抓包的网卡上就再也没有流量上来了。使用ifconfig -a 查看
eth1 Link encap:Ethernet HWaddr 00:0C:29:F6:7F:E1
inet addr:192.168.2.192 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef6:7fe1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1738132 errors:0 dropped:6356865 overruns:0 frame:0
TX packets:1328354 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:840530707 (801.5 MiB) TX bytes:1706701844 (1.5 GiB)
发现RX dropped 非常的高,自没有流量上来以后,所有的包都被丢弃了。
再查看一下ethtool -S eth1
NIC statistics:
rx_packets: 1740086
tx_packets: 327205
rx_bytes: 847640005
tx_bytes: 1652632934
rx_broadcast: 0
tx_broadcast: 0
rx_multicast: 0
tx_multicast: 0
rx_errors: 0
tx_errors: 0
tx_dropped: 0
multicast: 0
collisions: 0
rx_length_errors: 0
rx_over_errors: 0
rx_crc_errors: 0
rx_frame_errors: 0
rx_no_buffer_count: 0
rx_missed_errors: 6356865
tx_aborted_errors: 0
tx_carrier_errors: 0
tx_fifo_errors: 0
tx_heartbeat_errors: 0
tx_window_errors: 0
tx_abort_late_coll: 0
tx_deferred_ok: 0
tx_single_coll_ok: 0
tx_multi_coll_ok: 0
tx_timeout_count: 0
tx_restart_queue: 0
rx_long_length_errors: 0
rx_short_length_errors: 0
rx_align_errors: 0
tx_tcp_seg_good: 91453
tx_tcp_seg_failed: 0
rx_flow_control_xon: 0
rx_flow_control_xoff: 0
tx_flow_control_xon: 0
tx_flow_control_xoff: 0
rx_long_byte_count: 847640005
rx_csum_offload_good: 822676
rx_csum_offload_errors: 0
alloc_rx_buff_failed: 0
tx_smbus: 0
rx_smbus: 0
dropped_smbus: 0
里面的rx_missed_errors很高。
出现问题的时候,查询了其它网卡,数据都是正常的。只有抓包的那个网卡出现问题。原以为是pf_ring的驱动模块出现了问题,把pfring.ko卸载以后,还是老样子。暂时没有头绪,就放狗去搜。找到几篇讨论的文章:
Problem with Intel 82579V and 82574L NIC.
Intel 82574L Gigabit network card - issues and resolution
82574 adapters are known to have a hardware problem that requires a special fix in the driver. I am unsure if the fix for this has made it into CentOS 6.1 or 6.2 but the kmod-e1000e from ELrepo does have the fix and can be installed from there.
这里讲到,在旧内核里面82574L的驱动是有问题的,是需要用一个特殊的驱动去修复的。后来查了一些其它相关资料。内核版本在2.6.35以后才修复了这个驱动,但是CentOS 6 的内核是2.6.32,所以没有办法解决。只有升级成ELrepo 提供的第三方驱动去解决了。
升级完成以后,持续测试了两天,都没有再出现断流的问题了。应该是解决了。