欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

【系统】什么是中断?如何处理软中断过多?

最编程 2024-01-11 20:18:44
...

目录

中断:

什么是中断?

linux系统怎么处理中断?

linux软中断都有什么?

如何定位软中断 CPU 使用率过高的问题?

如果是 NET_RX 比较高

tcpdump如何抓包


中断:

什么是中断?

  • 比如说我正在学习,有人打电话给我,让我出去拿外卖,打电话这个事件就是一个中断,没收到中断之前,我可以学习,发生中断,我会停下当前事情,去处理另一个事情,也就是去门口拿外卖。操作系统收到了中断请求,会打断其他进程的运行,所以中断请求的响应程序,也就是中断处理程序(就是这里的接电话),要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。而且,中断处理程序在响应中断时,可能还会「临时关闭中断」,这意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就说中断有可能会丢失,所以中断处理程序要短且快。比如在接外卖员电话时,导师又打电话了,电话占线打不通,尝试几次后导师就不打了,相当于丢失一次中断。

linux系统怎么处理中断?

  • Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」。
  • 上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
  • 下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行。
  • 比如说上面的例子,我为了不影响后续电话的打入,我给外卖小哥说,好的,我下楼了,有什么事情一会见面说,然后快速挂断电话,这样就就可以最大程度的不影响后续的接收中断
  • 举一个计算机中的例子:
    • 网卡收到网络包后,会通过硬件中断通知内核有新的数据到了,于是内核就会调用对应的中断处理程序来响应该事件,这个事件的处理也是会分成上半部和下半部。

上部分要做到快速处理,所以只要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态,比如把状态更新为表示数据已经读到内存中的状态值。

接着,内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给「软中断处理程序」去做,也就是中断的下半部,其主要是需要从内存中找到网络数据,再按照网络协议栈,对网络数据进行逐层解析和处理,最后把数据送给应用程序。

所以,中断处理程序的上部分和下半部可以理解为:

  • 上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行;
  • 下半部是由内核触发,也就说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;

还有一个区别,硬中断(上半部)是会打断 CPU 正在执行的任务,然后立即执行中断处理程序,而软中断(下半部)是以内核线程的方式执行,并且每一个 CPU 都对应一个软中断内核线程,名字通常为「ksoftirqd/CPU 编号」,比如 0 号 CPU 对应的软中断内核线程的名字是 ksoftirqd/0

不过,软中断包括但是不限于硬件设备中断处理程序的下半部,一些内核自定义事件也属于软中断,比如内核调度等、RCU 锁(内核里常用的一种锁)等。

si软中断:程序内部产生的中断   软中断是由软件实现的中断,是纯粹由软件实现的一种类似中断的机制,实际上是模仿硬件,在内存中存储着一组软中断的标志位,然后由内核的一个守护线程不断轮询这些标志位,如果有哪个标志位有效,则再去执行这个软中断对应的中断处理程序.

linux软中断都有什么?

Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的累计中断次数情况,如果要实时查看中断次数的变化率,可以使用 watch -d cat /proc/softirqs 命令

接下来,就来简单的解析下 /proc/softirqs 文件的内容,在我服务器上查看到的文件内容如下:

你可以看到,每一个 CPU 都有自己对应的不同类型软中断的累计运行次数,有 3 点需要注意下。

第一点,要注意第一列的内容,它是代表着软中断的类型,在我的系统里,软中断包括了 10 个类型,分别对应不同的工作类型,比如 NET_RX 表示网络接收中断,NET_TX 表示网络发送中断、TIMER 表示定时中断、RCU 表示 RCU 锁中断、SCHED 表示内核调度中断。

第二点,要注意同一种类型的软中断在不同 CPU 的分布情况,正常情况下,同一种中断在不同 CPU 上的累计次数相差不多,比如我的系统里,NET_RX 在 CPU0 、CPU1、CPU2、CPU3 上的中断次数基本是同一个数量级,相差不多。

第三点,这些数值是系统运行以来的累计中断次数,数值的大小没什么参考意义,但是系统的中断次数的变化速率才是我们要关注的,我们可以使用 watch -d cat /proc/softirqs 命令查看中断次数的变化速率。

前面提到过,软中断是以内核线程的方式执行的,我们可以用 ps 命令可以查看到,下面这个就是在我的服务器上查到软中断内核线程的结果:

可以发现,内核线程的名字外面都有有中括号,这说明 ps 无法获取它们的命令行参数,所以一般来说,名字在中括号里的都可以认为是内核线程。

而且,你可以看到有 4 个 ksoftirqd 内核线程,这是因为我这台服务器的 CPU 是 4 核心的,每个 CPU 核心都对应着一个内核线程。

hi硬中断:键盘外部输入产生的中断

如何定位软中断 CPU 使用率过高的问题?

top 进入交互界面

接下来按1,查看每个cpu占用

如果si占用过高,可以看si对应的COMMAND,要知道是什么软中断类型导致的,如果COMMAND是软中断 ksoftirqd,我们可以使用 watch -d cat /proc/softirqs 命令查看每个软中断类型的中断次数的变化速率。

如果是 NET_RX 比较高

一般对于网络 I/O 比较高的 Web 服务器,NET_RX 网络接收中断的变化速率相比其他中断类型快很多。

如果发现 NET_RX 网络接收中断次数的变化速率过快,接下来就可以使用 sar -n DEV 查看网卡的网络包接收速率情况,然后分析是哪个网卡有大量的网络包进来。

接着,在通过 tcpdump 抓包,分析这些包的来源,如果是非法的地址,可以考虑加防火墙,如果是正常流量,则要考虑硬件升级等。

tcpdump如何抓包

tcpdump是一种网络嗅探器

抓包:将接口设置为混杂模式(promisc),这样但凡送到这个接口所有的包都可以捕获到。

使用方法:

tcpdump

                -i +interface

                -w file 写到哪个文件

                -nn:地址、端口都解析为数字格式

                -X: 显示十六进制和ascii格式

                -XX:包含了链路层

                -A:显示ascii格式,包含了链路层

                -V:详细信息

                -VV:更详细信息

                -r file:从上面保存的文件中读取信息

                expression:

                        关键字:

                        type:host,net,port,portange

                        dir 流向 有:src,dst,src or dst,src and dst

                        proto:ether , ip , arp, tcp , udp , wlan

                        组合条件:

                                and 、or、not

tcpdump -i eth0 eth0接口上所有的包

tcpdump -i eth0 -nn host 172.16.100.6 关于172.16.100.6 所有通信流,有 172.16.100.6 发给别人,也有别人发给 172.16.100.6 的

tcpdump -i eth0 -nn dst host 172.16.100.6 只有目标是172.16.100.6 的通信流

tcpdump -i eth0 -nn src and dst host 172.16.100.6 172.16.100.6 本机自己通信

tcpdump -i eth0 tcp dst port 80 目标端口是80的通信流

tcpdump -i eth0 tcp port 80 源或者目标都是80

如何抓取172.16.100.5、 172.16.100.15之间的通信?

tcpdump -i eth0 -nn host 172.16.100.15 and 172.16.100.5

tcpdump -i eth0 -nn host 172.16.100.15 and \(172.16.100.5 or 172.16.100.77\) 

 172.16.100.15 and 72.16.100.5 或者172.16.100.15与172.16.100.77的通信

参考:2.6 什么是软中断? | 小林coding 

推荐阅读