网卡绑cpu的脚本

来源:互联网 发布:手机app淘宝怎么投诉 编辑:程序博客网 时间:2024/04/28 19:27

今天开始实践将网卡的中断绑定到特定处理器核,于是用到将二进制转换成十六进制的需求。

目标是将网卡的中断“均匀”绑定到特定的处理器核上去:

#网卡数组
net_dev=(`for dev in /sys/class/net/*/device ; do awk -F/ ‘{print $5}’ <<< ${dev} ; done`)

#激活网卡IRQ数组
net_irq=(`for i in ${net_dev[@]} ; do awk ‘/’${i}’-/{print $1}’ /proc/interrupts | sed ‘s/[: ]//g’ ; done`)

#激活网卡队列数
net_q=${#net_irq[@]}

#处理器核数
cpu_n=`grep -c processor /proc/cpuinfo`

#绑定法则
#中断号数组下标%处理器核数,求余,为CPU编号
for((i=0;i<net_q;i++)) ; do
irq=${net_irq[i]}
m=$((i % cpu_n))
cpu=`echo -n ’1′; for((n=0;n<m;n++)); do echo -n ’0′ ; done`
smp_affinity=`echo “obase=16;ibase=2; $cpu” | bc`
echo $smp_affinity > /proc/irq/$irq/smp_affinity
done

其中:

echo “obase=16;ibase=2; $cpu” | bc

是利用bc将二进制数转化成十六进制数。

当下的网卡大都已经支持多队列了。

多队列,网卡就可以把“中断”呼叫分派给不同的处理器,而不必以前那样,只有一个处理器在处理网络流量。

“多队列”需要网卡硬件以驱动程序两者配合才能发挥作用。升级内核到最新(发行版自带的),这很重要。

查看/proc/interrupts中是否包含多个eth0-,有几个就有几个队列。有几个队列,就可以同时“中断”几个CPU,相当于可以有几个“并发”处理。

irqbalance这个应用本来是好意,但是在网卡多队列的时候,这个东东还是关闭为好。然后将“中断”绑定到固定的CPU上,这样:

1. 可以提高CPU缓存的命中率(这个对速度的提高,效果很明显)。

2. 可以降低CPU互斥。

如何绑定,查看内核文档:filesystems/proc.txt、IRQ-affinity.txt

 

 

 

原创粉丝点击