最近一直接触千兆网卡,稍微总结备忘一下,主要内容转自
总线连接
- 不要使用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/interruptsCPU0 CPU1 0: 1363520287 5788 IO-APIC-edge timer 8: 1 1 IO-APIC-edge rtc 9: 0 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;