Linux多队列网卡的硬件的实现详解(3)

时间:2017-04-01 10:39:13 

【点击图片进入下一页或下一篇】

图4.3 合理的中断绑定

set_irq_affinity脚本位于http://mirror.oa.com/tlinux/tools/set_irq_affinity.sh。

6.多队列网卡识别

#lspci -vvv

Ethernet controller的条目内容,如果有MSI-X && Enable+ && TabSize > 1,则该网卡是多队列网卡,如图4.4所示。

【点击图片进入下一页或下一篇】

图4.4 lspci内容

Message Signaled Interrupts(MSI)是PCI规范的一个实现,可以突破CPU 256条interrupt的限制,使每个设备具有多个中断线变成可能,多队列网卡驱动给每个queue申请了MSI。MSI-X是MSI数组,Enable+指使能,TabSize是数组大小。

# setting up irq affinity according to /proc/interrupts

# 2008-11-25 Robert Olsson

# 2009-02-19 updated by Jesse Brandeburg

#

# > Dave Miller:

# (To get consistent naming in /proc/interrups)

# I would suggest that people use something like:

# char buf[IFNAMSIZ+6];

#

# sprintf(buf, "%s-%s-%d",

# netdev->name,

# (RX_INTERRUPT ? "rx" : "tx"),

# queue->index);

#

# Assuming a device with two RX and TX queues.

# This script will assign:

#

# eth0-rx-0 CPU0

# eth0-rx-1 CPU1

# eth0-tx-0 CPU0

# eth0-tx-1 CPU1

#

set_affinity()

{

MASK=$((1<<$VEC))

printf "%s mask=%X for /proc/irq/%d/smp_affinity " $DEV $MASK $IRQ

printf "%X" $MASK > /proc/irq/$IRQ/smp_affinity

#echo $DEV mask=$MASK for /proc/irq/$IRQ/smp_affinity

#echo $MASK > /proc/irq/$IRQ/smp_affinity

}

if [ "$1" = "" ] ; then

echo "Description:"

echo " This script attempts to bind each queue of a multi-queue NIC"

echo " to the same numbered core, ie tx0|rx0 --> cpu0, tx1|rx1 --> cpu1"

echo "usage:"

echo " $0 eth0 [eth1 eth2 eth3]"

fi

# check for irqbalance running

IRQBALANCE_ON=`ps ax | grep -v grep | grep -q irqbalance; echo $?`

if [ "$IRQBALANCE_ON" == "0" ] ; then

echo " WARNING: irqbalance is running and will"

echo " likely override this script"s affinitization."

echo " Please stop the irqbalance service and/or execute"

echo " "killall irqbalance""

fi

#

# Set up the desired devices.

#

for DEV in $*

do

for DIR in rx tx TxRx

do

MAX=`grep $DEV-$DIR /proc/interrupts | wc -l`

if [ "$MAX" == "0" ] ; then

MAX=`egrep -i "$DEV:.*$DIR" /proc/interrupts | wc -l`

fi

if [ "$MAX" == "0" ] ; then

echo no $DIR vectors found on $DEV

continue

#exit 1

fi

for VEC in `seq 0 1 $MAX`

do

IRQ=`cat /proc/interrupts | grep -i $DEV-$DIR-$VEC"$" | cut -d: -f1 | sed "s/ //g"`

if [ -n "$IRQ" ]; then

set_affinity

else

IRQ=`cat /proc/interrupts | egrep -i $DEV:v$VEC-$DIR"$" | cut -d: -f1 | sed "s/ //g"`

if [ -n "$IRQ" ]; then

set_affinity

fi

fi

done

done

done

看不过瘾?点击下面链接!
本站微信公众号:gsjx365,天天有好故事感动你!

上一页123下一页

相关电脑知识

美图欣赏

电脑知识排行榜