为什么irq绑定单核后NET_RX_SOFTIRQ统计在所有CPU上

5440阅读 0评论2019-01-25 wzzushx
分类:LINUX

查看网络中断绑定在cpu3
cat /proc/interrupts | grep -E 'CPU|44'
           CPU0       CPU1       CPU2       CPU3
 44:          0          0          0       3836       GIC 178 Level     brcm_44
IPI2:         0          0          0          0       CPU stop interrupts

cat /proc/softirqs | grep  -E 'CPU|NET_RX'
                    CPU0       CPU1       CPU2       CPU3
      NET_RX:        653         10          9        193
思索了很久,认为跟ksoftirqd相关
ps | grep ksoftirq
    3  root         0       0  SW   <0>  [ksoftirqd/0]
   12  root         0       0  SW   <1>  [ksoftirqd/1]
   16  root         0       0  SW   <2>  [ksoftirqd/2]
   20  root         0       0  SW   <3>  [ksoftirqd/3]
 2133  root      5596     560  S    <1>  grep ksoftirq

ksoftirqd是一种均衡机制引入的内核线程。在设计机制上,linux依次优先处理中断、软中断、进程。软中断有几个处理时机:1、中断返回;2、软中断重新触发自己执行(如网络子系统)。
在大网络包发生时,可能导致进程饿死。
但如果将自行触发的软中断延迟到下一次软中断中执行,可能导致软中饥饿。
作为改进,当大量软中断产生的时候,内核引入了一组内核线程来处理负载。这些线程的优先级比较低,避免跟重要任务冲突。

ksoftirq会在每个cpu上都有一个实例,这样,即使中断绑定到某单核,也会出现softirq出现在其他cpu上。

上一篇:softirq原理以及源码分析
下一篇:linux进程调度之 FIFO 和 RR 调度策略