硬中断、软中断详解

文章目录

        什么是中断?

        什么是计算机的中断?

        什么叫硬中断、什么叫软中断?

        怎么查看硬中断、软中断

                查看硬中断的运行情况 cat /proc/interrupts

                查看软中断的运行情况 cat /proc/softirqs

        怎么排查软中断过高的问题?

        软中断注意事项

什么是中断?

举个现实生活中的例子:你正在学习,突然快递员给你打电话通知你快递到了。快递员打的电话就是中断信号,因为它中断了你的学习。你接完电话转头给女朋友说给她买的礼物到了,她就蹦跶蹦跶地去拿快递了,这个过程属于对中断信号的处理。给女朋友说完之后你继续学习,这叫中断的恢复。

什么是计算机的中断?

在计算机中,中断是系统响应硬件/软件设备消息的一种机制。系统运行时收到设备发来的信号,会打断当前进程,调用内核的中断处理程序来处理此信号,这个过程叫中断。

很明显,中断机制大大提高了系统的并发能力,但由于中断处理会打断当前程序的执行,所以中断处理越快越好。

要注意的是:中断处理程序在响应中断时,可能会"临时关闭中断",即中断处理过程中无法响应新的中断信号,意味着中断信号会无响应。以上面的收快递为例,快递员在给你电话的时候,别人就没办法再给你打电话了,所以接快递员电话的时间越短越好。

什么叫硬中断、什么叫软中断?

继续以上面的收快递为例:你正在学习,这叫当前进程;快递员给你打电话,这叫中断信号;

你接快递员电话,这叫中断处理的上半部分,可以理解为硬中断,时间很短

你挂掉电话,通知给了女朋友,她下楼去拿快递,这叫中断处理的下半部分,可以理解为软中断,处理过程比较慢,唯一好处是你立马恢复了学习;

举个计算机的例子:系统正在运行,这个时候收到一条网络消息,网卡把消息通过DMA复制到内存的RingBuffer后会向CPU发出中断信号,CPU的处理也很简单,唤醒一个内核中断进程,中断进程ksoftirqd会根据RingBuffer中的数据的IP和端口号将其拷贝到对应socket的缓冲区并唤醒对应的进程处理。其中:

1. DMA向CPU发出的信号就叫硬中断信号,CPU对该信号的处理叫硬中断处理。

硬中断的特点是向CPU发出了中断,会打断CPU当前工作,CPU的处理也很快,唤醒软中断处理就不管了。

2. CPU唤醒内核中断程序,发出的信号就叫软中断信号,中断进程对RingBuffer消息的分析处理,唤醒对应的进程,叫软中断处理

软中断的特点是由中断进程ksoftirqd处理,比较复杂且耗时。其实不仅有网络消息,系统内部也会触发软中断,比如定时器触发,内核调度,RCU锁等等。

每个CPU都有自己专属的中断进程,名字为「ksoftirqd/CPU编号」,比如第0号CPU对应的软中断内核线程的名字是 ksoftirqd/0

怎么查看硬中断、软中断

查看硬中断的运行情况 cat /proc/interrupts

硬中断、软中断详解_第1张图片

 各个列的说明如下

第1列:逻辑中断号(linux分配的中断号)

第2~5列:每个逻辑CPU上中断的数

第6列:处理这个中断的中断控制器。在具有I/O APIC的系统上,大多数中断会列出IO-APIC-level或IO-APIC-edge,为自己的中断控制器

最后一列:与这个中断相关的设备名字,比如i8042一般表示键盘和鼠标,比如 virtio3-intput.0 和virtio3-output.0对应的是虚拟网卡eth3的接收和发送队列

查看软中断的运行情况 cat /proc/softirqs

硬中断、软中断详解_第2张图片

 第一列表中断类型

TIMER表定时器中断;NET_TX表络发送中断;NET_RX表网络接收中断;SCHED表示内核调度中断,RCU表RCU锁中断

第2~5列表各个CPU上发生的中断计数

注意:这些数值是系统运行以来的累计中断次数,数值的大小没什么参考意义,我们更关注的是这些中断的变化速率。所以使用命令 watch -d cat /proc/softirqs 来查看软中断的变化速度,如下图

硬中断、软中断详解_第3张图片

 使用命令 ps axu | grep ksoftirqd 来查看各个软中断线程,跟上面的 cat /proc/softirqs结果一一对应,每个ksoftirqd对应一个逻辑CPU

硬中断、软中断详解_第4张图片

 怎么排查软中断过高的问题?

用top命令查看整体系统的运行情况,再按数字1可以查看各个cpu的详细信息(由于我手头上没有软中断高的机器,这个图是网上找的)

硬中断、软中断详解_第5张图片

上图可以看到两个cpu的运行情况,虽然总体使用率不高,但是都用在了si(软中断)上。

另外,也可以看到 CPU 使用率最高的进程也是软中断 ksoftirqd/0 和ksoftirqd/1,所以可以认为此时系统的开销主要耗在了软中断

再结合命令 watch -d cat /proc/softirqs 来查看各个软中断的变化速度,看变化最快的是哪种类型的软中断

如果是网络IO型服务器,那么 NET_TX 和 NET_RX类型的软中断会比较多,再结合tcpdump工具抓包来分析,是不是有非法IP,流量是否正常,而且可结合网关服日志,一起分析

软中断注意事项

默认情况下,单队列的网卡只有一个中断号,同一时刻只能绑定到一个CPU上。虚拟机上很容易出现机器有多个CPU,但只有一个CPU繁忙的情况。

解决办法有多种

1. 把网卡改为多队列网卡,虚拟机可通过镜像设置

2. 设置多CPU中断亲和性配置

3. 设置网卡负载均衡

具体办法参见这几篇博客

软中断竟然是可一个CPU使劲造? - 知乎

软中断处理方法_51CTO博客_软中断

【转】ksoftirqd进程耗尽单核100%si处理软中断导致性能瓶颈 - 简书

你可能感兴趣的:(知识积累,硬中断,软中断,硬中断,软中断)