相比使用内核的irqbalance使网卡中断在所有核上进行调度的方式,使用手动绑核将中断固定住的方式更能有效提高业务网络收发包的能力。
进行网卡中断绑核之前,需要先关闭irqbalance。
调优方法
- 停止irqbalance服务。
|
systemctl stop irqbalance.service
|
- 关闭irqbalance服务。
|
systemctl disable irqbalance.service
|
- 查看irqbalance服务状态是否已关闭。
|
systemctl status irqbalance.service
|
状态为inactive即为关闭。

- 查看网卡PCI设备号,假设当前网卡名为enp131s0。

- 查看PCIe网卡所属的NUMA Node。请将以下命令中的bus-info替换为4中查询到的具体值。

- 查看NUMA Node对应的Core的区间。例如此处就可以绑到NUMA Node 48~63。

- 创建smartIrq.sh脚本。
- 创建smartIrq.sh。
vi smartIrq.sh
- 按“i”进入编辑模式,在文件中添加以下内容:
|
#!/bin/bash
irq_list=(`cat /proc/interrupts | grep enp131s0 | awk -F: '{print $1}'`)
cpunum=48 # 修改为所在Node的第一个Core
for irq in ${irq_list[@]}
do
echo $cpunum > /proc/irq/$irq/smp_affinity_list
echo `cat /proc/irq/$irq/smp_affinity_list`
(( cpunum+=1 ))
done
|
enp131s0为用于绑定队列的网卡名称,请根据实际情况修改。
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 进行中断绑核。1822网卡共有16个队列,将这些中断逐个绑定至所在NUMA Node的16个Core上。例如本例中绑核到NUMA Node2对应的48~63上面。
- 创建irqCheck.sh脚本。
- 创建irqCheck.sh脚本。
vi irqCheck.sh
- 按“i”进入编辑模式,在文件中添加以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/bin/bash
# 网卡名
intf=$1
log=irqSet-`date "+%Y%m%d-%H%M%S"`.log
# 可用的CPU数
cpuNum=$(cat /proc/cpuinfo |grep processor -c)
# RX TX中断列表
irqListRx=$(cat /proc/interrupts | grep ${intf} | awk -F':' '{print $1}')
irqListTx=$(cat /proc/interrupts | grep ${intf} | awk -F':' '{print $1}')
# 绑定接收中断rx irq
for irqRX in ${irqListRx[@]}
do
cat /proc/irq/${irqRX}/smp_affinity_list
done
# 绑定发送中断tx irq
for irqTX in ${irqListTx[@]}
do
cat /proc/irq/${irqTX}/smp_affinity_list
done
|
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 利用脚本查看是否绑核成功,假设当前网卡名为enp131s0。
绑核成功结果示例:
