网卡软中断绑定过程

网卡软中断绑定过程

软中断是什么

内核的软中断系统是一种在硬中断处理上下文(驱动中)之外执行代码的机制。硬中断处理函数(handler)执行时,会屏蔽部分或全部(新的)硬中断。中断被屏蔽的时间越长,丢失事件的可能性也就越大。所以,所有耗时的操作都应该从硬中断处理逻辑中剥离出来,硬中断因此能尽可能快地执行,然后再重新打开硬中断。
内核中也有其他机制将耗时操作转移出去,不过对于网络栈,我们接下来只看软中断这种方式。
可以把软中断系统想象成一系列内核线程(每个 CPU 一个),这些线程执行针对不同事件注册的处理函数(handler)。如果你执行过 top 命令,可能会注意到ksoftirqd/0 这个内核线程,其表示这个软中断线程跑在 CPU 0 上。
内核子系统(比如网络)能通过 open_softirq 函数注册软中断处理函数。接下来我们会看到网络系统是如何注册它的处理函数的。现在先来学习一下软中断是如何工作的。

ksoftirqd

软中断对分担硬中断的工作量非常重要,因此软中断线程在内核启动的很早阶段就 spawn 出来了。

·kernel/softirq.c展示了 ksoftirqd 系统是如何初始化的:

static struct smp_hotplug_thread softirq_threads = {
      .store              = &ksoftirqd,
      .thread_should_run  = ksoftirqd_should_run,
      .thread_fn          = run_ksoftirqd,
      .thread_comm        = "ksoftirqd/%u",
};
static __init int spawn_ksoftirqd(void)
{
      register_cpu_notifier(&cpu_nfb);
      BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
      return 0;
}
early_initcall(spawn_ksoftirqd);

看到注册了两个回调函数: ksoftirqd_should_runrun_ksoftirqd。这两个函数都会从kernel/smpboot.c里调用,作为事件处理循环的一部分。

kernel/smpboot.c 里面的代码首先调用 ksoftirqd_should_run 判断是否有 pending 的软中断,如果有,就执行 run_ksoftirqd,后者做一些 bookeeping 工作,然后调用__do_softirq

__do_softirq

__do_softirq 做的几件事情:

  • 判断哪个 softirq 被 pending
  • 计算 softirq 时间,用于统计
  • 更新 softirq 执行相关的统计数据
  • 执行 pending softirq 的处理函数

查看 CPU 利用率时,si 字段对应的就是 softirq,度量(从硬中断转移过来的)软中断的 CPU 使用量。

监控

软中断的信息可以从 /proc/softirqs 读取:

$ cat /proc/softirqs
                    CPU0       CPU1       CPU2       CPU3
          HI:          0          0          0          0
       TIMER: 2831512516 1337085411 1103326083 1423923272
      NET_TX:   15774435     779806     733217     749512
      NET_RX: 1671622615 1257853535 2088429526 2674732223
       BLOCK: 1800253852    1466177    1791366     634534
BLOCK_IOPOLL:          0          0          0          0
     TASKLET:         25          0          0          0
       SCHED: 2642378225 1711756029  629040543  682215771
     HRTIMER:    2547911    2046898    1558136    1521176
         RCU: 2056528783 4231862865 3545088730  844379888

监控这些数据可以得到软中断的执行频率信息。

例如,NET_RX 一行显示的是软中断在 CPU 间的分布。如果分布非常不均匀,那某一列的值就会远大于其他列,这预示着下面要介绍的 Receive Packet Steering / Receive Flow
Steering 可能会派上用场。但也要注意:不要太相信这个数值,NET_RX 太高并不一定都是网卡触发的,下面会看到其他地方也有可能触发之。

调整其他网络配置时,可以留意下这个指标的变动。

绑定软中断

第一步:确定要绑定的网卡

​ enP1p3s0f0
​ enP1p3s0f1
​ b.关闭irq,systemctl stop irqbalance.service

第二步:确定local_cpu序号

[root@node-1 ~]# cat /sys/class/net/enP1p3s0f0/device/local_cpulist
64-71

第三部:查询网卡的中断号

[root@node-1 ~]# ll  /sys/class/net/enP1p3s0f0/device/msi_irqs/
total 0
drwxr-xr-x 2 root     0 Mar 23 17:37 .
drwxr-xr-x 6 root     0 Mar 23 16:30 ..
-r--r--r-- 1 root 65536 Mar 23 21:15 266
-r--r--r-- 1 root 65536 Mar 23 21:15 267
-r--r--r-- 1 root 65536 Mar 23 21:15 268
-r--r--r-- 1 root 65536 Mar 23 21:15 269
            |
            |
            |
-r--r--r-- 1 root 65536 Mar 23 20:29 328
-r--r--r-- 1 root 65536 Mar 23 20:29 329
[root@node-1 ~]# 

第四部绑定:

[root@node-1 ~]# echo 64 > /proc/irq/266/smp_affinity_list
[root@node-1 ~]# cat /proc/irq/266/smp_affinity_list
64
[root@node-1 ~]#

绑定的脚本

a=63
for i in {267..330};
do
a=$(($a+1))
echo $a >  /proc/irq/$i/smp_affinity_list 
if [ $a -ge 71 ];then
a=63
fi
done
posted @ 2021-04-09 12:39  mrwuzs  阅读(1602)  评论(0编辑  收藏  举报