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