ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网卡软中断绑定过程

2021-04-09 13:03:04  阅读:259  来源: 互联网

标签:softirq 23 中断 绑定 网卡 -- root ksoftirqd


网卡软中断绑定过程

软中断是什么

内核的软中断系统是一种在硬中断处理上下文(驱动中)之外执行代码的机制。硬中断处理函数(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

标签:softirq,23,中断,绑定,网卡,--,root,ksoftirqd
来源: https://www.cnblogs.com/mrwuzs/p/14636636.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有