网卡软中断绑定过程
作者:互联网
网卡软中断绑定过程
软中断是什么
内核的软中断系统是一种在硬中断处理上下文(驱动中)之外执行代码的机制。硬中断处理函数(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_run
和 run_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
标签:softirq,23,中断,绑定,网卡,--,root,ksoftirqd 来源: https://www.cnblogs.com/mrwuzs/p/14636636.html