linux下ixgbe网卡应用点滴


1. 兼容光模块

ixgbe光纤网卡的驱动在默认情况下不支持第三方兼容光模块,会导致网卡驱动加载失败,表现为,执行lspci |grep 82599能看到网卡在pci设备中

06:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)
06:00.1 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)

但是使用ifconfig -a命令,却找不到网卡,使用demsg可以看到以下出错信息:

ixgbe 0000:06:00.0: failed to load because an unsupported SFP+ module type was detected

解决问题的方法是,执行rmmod ixgbe,卸载掉驱动,然后执行

modprobe ixgbe allow_unsupported_sfp=1,1 

驱动对allow_unsupported_sfp的解释为:

allow_unsupported_sfp:Allow unsupported and untested SFP+ modules on 82599-based adapters (uint)

重新加载后,大部分情况下ifconfig就能够看到网卡信息了。


2. RSS队列设置

RSS(receive side scaling)是有微软提出的一种负载分流方法,能够将网卡的流分配到不同的队列中,再由不同的cpu核来处理,通过这项技术能够将网络流量分载到多个cpu上,降低单个cpu的占用率。默认情况下,每个cpu核对应一个rss队列。ixgbe驱动将收到的数据包的源、目的ip地址和端口号,交由网卡硬件计算出一个rss hash值,再根据这个hash值来决定将数据包分配到哪个队列中。通过cat /proc/interrupts |grep 网卡名的方式,就可以看到网卡使用了几个rss通道。

加载ixgbe时,也可以通过命令行来决定rss通道的个数:

modprobe ixgbe MQ=1,1 RSS=8,8

其中,MQ的含义为:

MQ:Disable or enable Multiple Queues, default 1 (array of int)

是否使用多队列,其中对于多个网口的情况,使用数组来表示针对每个网口的配置

RSS:Number of Receive-Side Scaling Descriptor Queues, default 0=number of cpus (array of int)


3. RSS的均中断

可以参照 http://blog.csdn.net/vah101/article/details/38615795

对于redhat或者centos用户,除了可以命令行操作,还可以使用tuna配置网卡队列的中断亲和性、进程的cpu亲和性。tuna的界面如图所示:



再有一个简单的方法,就是执行ixgbe网卡驱动包里面的scripts目录下的脚本set_irq_affinity.sh,killall irqbalance 杀掉irqbalance,再执行:

[root@111 scripts]# sh set_irq_affinity.sh eth2
 WARNING: irqbalance is running and will
          likely override this script's affinitization.
          Please stop the irqbalance service and/or execute
          'killall irqbalance'
eth2 mask=1 for /proc/irq/183/smp_affinity
eth2 mask=2 for /proc/irq/184/smp_affinity
eth2 mask=4 for /proc/irq/185/smp_affinity
eth2 mask=8 for /proc/irq/186/smp_affinity
eth2 mask=10 for /proc/irq/187/smp_affinity
eth2 mask=20 for /proc/irq/188/smp_affinity
eth2 mask=40 for /proc/irq/189/smp_affinity
eth2 mask=80 for /proc/irq/190/smp_affinity
eth2 mask=100 for /proc/irq/191/smp_affinity
eth2 mask=200 for /proc/irq/192/smp_affinity
eth2 mask=400 for /proc/irq/193/smp_affinity
eth2 mask=800 for /proc/irq/194/smp_affinity
eth2 mask=1000 for /proc/irq/195/smp_affinity
eth2 mask=2000 for /proc/irq/196/smp_affinity
eth2 mask=4000 for /proc/irq/197/smp_affinity
eth2 mask=8000 for /proc/irq/198/smp_affinity
eth2 mask=10000 for /proc/irq/199/smp_affinity
eth2 mask=20000 for /proc/irq/200/smp_affinity
eth2 mask=40000 for /proc/irq/201/smp_affinity
eth2 mask=80000 for /proc/irq/202/smp_affinity
eth2 mask=100000 for /proc/irq/203/smp_affinity
eth2 mask=200000 for /proc/irq/204/smp_affinity
eth2 mask=400000 for /proc/irq/205/smp_affinity
eth2 mask=800000 for /proc/irq/206/smp_affinity

结果就是将eth2的中断依次的绑定到不同的cpu核上


4. RSS的高级配置

(1)ixgbe网卡RSS hash值的计算方法可以参考82599_datasheet_rev_2_0.pdf,可以从ftp://ftp.pku.edu.cn/open/net/Intel-NIC/doc/82599_Datasheet_rev_2_0.pdf下载。

其rss hash值的计算方法存在一个问题,就是对于同一个流的收、发这两个方向的数据包的rss hash值是不同的,也就是同一个流的两个方向的数据包会被分流到不同的队列中,为了解决这个问题,有人提出了修改RSS random key register(RSSRK),将其改为重复的16个bit,来获取对称的结果,方法如http://www.hiyoufu.com/?p=33这篇博文所示。

(2)默认情况下,是数据包的四元组参与计算哈希值,但是针对特殊的需要,通过ethtool -N命令可以配置参与计算的元组,ethtool的帮助上有这么一句话:

rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 
m|v|t|s|d|f|n|r...
其中:

f   Hash on bytes 0 and 1 of the Layer 4 header of the rx packet.
n Hash on bytes 2 and 3 of the Layer 4 header of the rx packet.
对于udp协议来说f、n为源端口、目的端口,s、d为源ip、目的ip

检查当前系统上对udp协议的hash方式,可以执行如下命令:

root@111#ethtool -n eth2 rx-flow-hash udp4
TCP over udp4 flows use these fields for computing Hash flow key:
IP SA
IP DA
L4 bytes 0 & 1 [TCP/UDP src port]
L4 bytes 2 & 3 [TCP/UDP dst port]

使用如下命令,可以改变hash的计算方式:

[root@111]# ethtool -N eth2 rx-flow-hash udp4 sd
[root@111]# ethtool -n eth2 rx-flow-hash udp4 
UDP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA

使用这种方法,可以改变RSS通道的分配方法


(3)Ethernet Flow Director包控制

注意,低版本的ethtool可能不支持,centos6.4上的3.5版本可以支持。最新的ethtool可以从http://ftp.kernel.org/pub/software/network/ethtool/下载

可以根据用户配置的策略将符合特定策略的数据包与相应的队列绑定在一起,也可以将符合特定策略的包丢掉

要使用这个功能首先要执行:

ethtool -K eth2 ntuple on (否则,就会报错rmgr: Cannot insert RX class rule: Operation not supported)

通过如下命令配置:

ethtool -N  DEVNAME flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4
[ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ proto %d [m %x] ]
[ src-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
[ dst-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
[ tos %d [m %x] ]
[ l4proto %d [m %x] ]
[ src-port %d [m %x] ]
[ dst-port %d [m %x] ]
[ spi %d [m %x] ]
[ vlan-etype %x [m %x] ]
[ vlan %x [m %x] ]
[ user-def %x [m %x] ]
[ action %d ]
[ loc %d]] |
delete %d


比如,要将192.168.100.1发来的包丢掉,使用如下命令:

[root@111]# ethtool --config-ntuple eth2 flow-type ip4 src-ip 192.168.100.1  action -1

可以通过这种方法将攻击流量直接过滤掉

将源端口为80的数据流,绑定到队列2:

[root@111]# ethtool --config-ntuple eth2 flow-type tcp4 src-port 80  action 2

[root@111]# ethtool --config-ntuple eth2 flow-type udp4 src-port 80  action 2

其中,action指的是网卡的队列序号,其中-1指丢弃。网卡的队列编号可以通过cat /proc/interrupts|grep ethX来查看,默认情况下就是cpu的核数。

另外,通过将不同端口绑定到不同的队列,可以将网卡的软中断分散,减少单核的cpu占用。(这主要是由于RSS队列最大只有16个,但是flow director的队列为cpu核数,一般服务使用的双志强cpu,核数可能要大于16)

要注意,flow director只支持对同一个域的过滤,即第一次对src-port过滤,后面加入的规则只能针对src-port,否则会包错:

rmgr: Cannot insert RX class rule: Invalid argument

dmesg提示:

Only one mask supported per port


5. offload配置

ixgbe提供了一定的offload能力,能够使用网卡板载的硬件处理数据包,从而降低cpu的占用率。

执行ethtool -k 网口名,就可以看到网卡对应的offload功能:

Features for eth6:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: on
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: on
receive-hashing: on

其中:

rx-checksumming是计算tcp接收端的校验和,打开此项offload的命令是:ethtool -K ethX rx on,如果此项为off,就无法打开large-receive-offload

tx-checksumming由网卡硬件计算发送校验和,通过ethtool -K ethX tx on激活

这两项配置对于数据包长度达到1500字节的大包,比较明显。

scatter-gather与block DMA方式相对应,能够使内核读取非连续的内存地址空间,使用此项功能能够减少内存的分配、拷贝,达到降低cpu占用率的目的,使用ethtool -K ethX sg开启

tcp-segmentation-offload用了作tcp分片的offload,将大数据包,比如超过64k的分片为长度为mtu以下的小数据包,激活的命令为 ethtool -K ethX tso on

large-receive-offload将一系列小包聚合成大包来处理

generic-segmentation-offload与tcp-segmentation-offload的功能相似,不过是用在ipv6或udp协议上的


6. 配置内核参数

禁用时间戳 sysctl -w net.ipv4.tcp_timestamps=0

配置读缓冲区 sysctl -w net.core.rmem_max=16777216

配置写缓冲区 sysctl -w net.core.rmem_max=16777216 

修改SACK and Nagle配置   sysctl -w net.ipv4.tcp_sack=0 

SACK and Nagle是用来优化tcp连接丢包情况下连接的性能,如果工作的网络环境很好,几乎不存在丢包情况,可以禁用掉SACK and Nagle。其原理说明在:

http://www.vants.org/?post=74





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com