现在的位置: 首页 > 综合 > 正文

网卡诊断

2017年11月11日 ⁄ 综合 ⁄ 共 2511字 ⁄ 字号 评论关闭

最近一直接触千兆网卡,稍微总结备忘一下,主要内容转自 这里

总线连接

  • 不要使用PCI接口(33MHz)
  • PCI接口(66MHz)下可连接1块网卡,PCI-X接口(66MHz以上)则可以连接1到2块网卡。但是PCI总线是共享的,所以如果有另外一个占带宽的设备,就有麻烦了:P
  • PCI-Express 适合1Gbps的网卡,但是不一定能适用于万兆卡。

检测网卡的命令:

dns1 log # lspci -t -v 
 

中断类型

中断类型有:

  • Edge-triggered
  • Leveled ( 非常糟糕的性能。当高吞吐量设备共享中断时,只能等死 = =+)
  • MSI ( Message Signaled Interrupt,信息信号中断),在PCI 2.3 以上版本及PCI-Express上都提供MSI支持。根据定义,MSI中断是独享的,指定给设备的每条MSI 消息保证在系统中均为唯一消息,也就是说,要实现系统对多块网卡的支持,MSI是必须的~
  • MSI-X  MSI-X 中断是 MSI 中断的增强版本,与 MSI 中断有相同功能,在intel的新平台上提供这项技术的实现~

实例

要点:

  • Capabilities: [f0] Message Signalled Interrupts: 64bit+ Queue=0/0 Enable-
  • Capabilities: [e4] PCI-X non-bridge device

即,使用 PCI-X接口 , MSI ( 由于部分主板默认关闭MSI中断,有时需要手动开启)

dns1 ~ # cat /proc/interrupts 
     CPU0  CPU1 
0:   1363520287 5788 IO-APIC-edge timer 
8:      1 IO-APIC-edge rtc 
9:      0 IO-APIC-level acpi 
169: 0     0 IO-APIC-level uhci_hcd:usb1 
177: 1835909945 1 IO-APIC-level eth0 
193: 158579743 56 IO-APIC-level ioc0 
201: 26    20 IO-APIC-level ioc1 
217: 0     0 IO-APIC-level uhci_hcd:usb2 
225: 0     0 IO-APIC-level uhci_hcd:usb3 
233: 0     0 IO-APIC-level ehci_hcd:usb4 
NMI: 0     0 
LOC: 1358270159 1358270158 
ERR: 0 
MIS: 0

这儿有一个奇怪的地方,eth0 支持 MSI,但是中断类型却是 IO-APIC-level,而在另一个服务器上,MSI 正常工作,并且显示为 "edge/MSI" 。原因是,新的PCI,PCI-Express才支持 MSI (edge-triggered),老版本的PCI只提供 level interrupts,因此,使用时需要注意PCI的版本。

网卡

FIFO buffer

大部分的Intel千兆网卡都内置了 FIFO buffer,通过FIFO buffer 网卡将数据包传入、传出DMA,所以对于高吞吐量的应用来说,这个部件是非常重要的。 不过,Intel 的前兆网卡的差别不大,按官方资料都可支持高负责的应用。不过,集成到主板的ICH8 千兆网卡 82566DC 不知是否因为失误Gigabit adapter只设计了16K的FIFO buffer。这就意味着,默认8K 用来接收,8K 用来发送,其潜在问题,不言而喻。如果FIFO buffer过小,也会增加PCI-Express延迟,使得吞吐在100Kpps左右就到达极限。继而首先flow-control
将不能正常工作,即便不出问题也会出现丢包。

因此,足够大的"Packet buffer",或者称为FIFO 是非常必要的。intel家族的网卡,可以通过查看PBA的值确认其大小,有时候 RX 的buffer大于TX, 例如 PBS 64K, PBA 48K。通常将 RX FIFO buffer 大小定义为 PBA ,可在源码中查看:

oid e1000_reset(struct e1000_adapter *adapter) 
{ 
   u32 pba = 0, tx_space, min_tx_space, min_rx_space; 
   u16 fc_high_water_mark = E1000_FC_HIGH_DIFF; 
   bool legacy_pba_adjust = false; 
 
   
   switch (adapter->hw.mac_type) 
   { 
       case e1000_82542_rev2_0: 
       case e1000_82542_rev2_1: 
       case e1000_82543: 
       case e1000_82544: 
       case e1000_82540: 
       case e1000_82541: 
       case e1000_82541_rev_2: 
            legacy_pba_adjust = true; 
            pba = E1000_PBA_48K; 
            break; 
       case e1000_82545: 
       case e1000_82545_rev_3: 
       case e1000_82546: 
       case e1000_82546_rev_3: 
            pba = E1000_PBA_48K; 
            break; 
       case e1000_82547: 
       case e1000_82547_rev_2: 
            legacy_pba_adjust = true; 
            pba = E1000_PBA_30K; 
            break; 
       case e1000_82571: 
       case e1000_82572: 
       case e1000_80003es2lan: 
            pba = E1000_PBA_38K; 
            break; 
       case e1000_82573: 
            pba = E1000_PBA_20K; 
          
【上篇】
【下篇】

抱歉!评论已关闭.