[转帖]软中断

中断 · 浏览次数 : 0

小编点评

## Soft Interrupts in Linux Kernel This article describes the soft interrupt handling process in the Linux kernel, highlighting the two stages: **upper half** and **lower half**. **Upper Half:** * This stage focuses on handling interrupts quickly. * It operates in an **interrupt disabled mode**, handling tasks like I/O, file operations, and miscellaneous low-priority work. * It directly handles hardware requests, performing low-level tasks. **Lower Half:** * This stage is responsible for delaying the processing of tasks in the upper half. * It runs in an **inter-kernel thread** with a lower priority than the upper half. * It handles long-running tasks and submits them to the lower half. **Soft Interrupts vs. Hard Interrupts:** * Soft interrupts are triggered by **kernel events**, while hard interrupts are triggered by **hardware events**. * Examples of kernel events include network activity, file system operations, and device activity. * Examples of hardware events include interrupts from peripherals, such as the hard disk. **Monitoring Soft Interrupts:** * You can use the `proc/softirqs` file to monitor the current state of soft interrupts. * It provides information such as the type, number of running threads, and recent events. * Use the `sar` command to monitor network and system statistics. **Observing Network Traffic:** * Use `sar` with the `-n` option to capture network statistics. * The relevant fields include **rxpck/s** and **txpck/s** for received and transmitted bytes per second. * Check for high values in **rxkB/s** and **txkB/s** to identify potential bottlenecks. **Additional Information:** * Each CPU has its own dedicated soft interrupt thread. * The `ps` command shows the number of running threads and the name of the thread for each soft interrupt. * Use `tcpdump` to capture and analyze network traffic. By understanding the soft interrupt handling process, you can identify and diagnose potential issues related to network performance and system responsiveness.

正文

https://www.jianshu.com/p/78f9dcd2a4b6

 

软中断:为了处理中断处理程序执行过长和中断丢失的问题,linux将中断处理过程分成两个阶段,也就是上半部和下半部:

  • 上半部:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或跟时间敏感的工作,直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行
  • 下半部:用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。由内核触发,也就是我们常说的软中断。

当然软中断不只包括了硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU锁等

查看软中断和内核线程

proc文件系统是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置,其中:
/proc/softirqs 提供了软中断的运行情况
/proc/interrupts 提供了硬中断的运行情况

watch -d cat /proc/softirqs

#watch命令可以定期查看输出,-d高亮显示变化部分
查看软中断信息
$ watch -d cat /proc/softirqs
                    CPU0       CPU1
          HI:          0          0
       TIMER:    1083906    2368646
      NET_TX:         53          9
      NET_RX:    1550643    1916776
       BLOCK:          0          0
    IRQ_POLL:          0          0
     TASKLET:     333637       3930
       SCHED:     963675    2293171
     HRTIMER:          0          0
         RCU:    1542111    1590625
  • 第一列显示软中断类别,总共有10个类别,分贝对应不同的工作类型;
  • 要注意同一种软中断在不同的cpu上的分布情况,正常情况下,同一种中断在不同的cpu上的累计次数应该差不多

ps aux |grep softirq
软中断实际上是以内核线程的方式运行的,每个cpu都对应一个软中断内核线程,就叫做ksoftirqd/1,
查看其运行状况:

#注意,这些线程的名字外面都有中括号,一般来说,ps的输出中,名字括在括号里的,一般都是内核线程
[root@localhost proc]# ps aux|grep softirq
root          3  0.0  0.0      0     0 ?        S    Feb12   0:09 [ksoftirqd/0]
root      80681  0.0  0.0 112648   956 pts/1    R+   00:59   0:00 grep --color=auto softirq

top
定位软中断问题,如下图:

 
image.png

 

  • 关注%cpu行的si,当>0时,就有软中断产生
  • 进程列表中如圈出的这种就是软中断内核进程

sar
使用watch -d cat /proc/softirqs看到变化速率最快的是NET_RX(网络接收),那么我们就可以使用sar来观察网络的接收情况,不仅可以观察网络收发的吞吐量(BPS,每秒收发的字节数),还可以观察网络收发的PPS,即每秒收发的网络帧数。

[root@localhost proc]# sar -n DEV 1
Linux 3.10.0-327.el7.x86_64 (localhost.localdomain)     02/14/23    _x86_64_    (1 CPU)

01:21:59        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
01:22:00    eno16777736      1.00      1.00      0.06      0.17      0.00      0.00      0.00      0.00
01:22:00           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
  • 第一列:表示报告的时间。
  • 第二列:IFACE 表示网卡。
  • 第三、四列:rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS。
  • 第五、六列:rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS

tcpdump
怀疑是网络接收中断的问题,若上面sar的结果eno16777736的接收网络帧和字节数异常,我们使用tcpdump来抓包查看

#-i eno16777736只抓取该网卡,-n不解析协议名和主机名
#tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
[root@localhost ~]# tcpdump -i eno16777736 -n tcp port 80

与[转帖]软中断相似的内容:

[转帖]软中断

https://www.jianshu.com/p/78f9dcd2a4b6 软中断:为了处理中断处理程序执行过长和中断丢失的问题,linux将中断处理过程分成两个阶段,也就是上半部和下半部: 上半部:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或跟时间敏感的工作,直接处理硬件

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、sy% 的关系 测试机型

[转帖]Linux内核网络中的软中断ksoftirqd

https://zhuanlan.zhihu.com/p/361976930 1. 前言 之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了,CPU会根据中断表,调用已经注册的中断函数,这个中断函数会调到驱动程序(NIC Driver)中相应

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ nginx性能和软中断 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、

[转帖]nginx性能和软中断

https://plantegg.github.io/2022/11/04/nginx%E6%80%A7%E8%83%BD%E5%92%8C%E8%BD%AF%E4%B8%AD%E6%96%AD/ nginx性能和软中断 问题 如何调整软中断才能达到最优性能? 通过 top 观察软中断 和 si%、

[转帖]《Linux性能优化实战》笔记(六)—— Linux 软中断与对应故障分析方法

中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。 一、 为什么要有中断 举个生活中的例子,让你感受一下中断的魅力。比如说你订了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度,但是,配送员送外卖是不等人的,到了你

[转帖]上下文切换的代价

https://plantegg.github.io/2022/06/05/%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E5%BC%80%E9%94%80/ 概念 进程切换、软中断、内核态用户态切换、CPU超线程切换 内核态用户态切换:还是在一个线程中

[转帖]Linux系统指令 top 之 %si 占用高,分析实例

https://www.coonote.com/linux-note/linux-top-si-high-instance.html 续“top %wa 高的问题”之后,又遇到top之%si过高(高峰时段超过95%)的问题。 %wa高,说明磁盘忙。譬如磁盘读写次数非常高。 %si高,是否说明软中断忙

[转帖]《Linux性能优化实战》笔记(23)—— 内核线程 CPU 利用率过高,perf 与 火焰图

在排查网络问题时,我们还经常碰到的一个问题,就是内核线程的 CPU 使用率很高。比如,在高并发的场景中,内核线程 ksoftirqd 的 CPU 使用率通常就会比较高。回顾一下前面学过的 CPU 和网络模块,你应该知道,这是网络收发的软中断导致的。 要分析 ksoftirqd 这类 CPU 使用率比

【转帖】linux 软连接的使用

https://www.cnblogs.com/sueyyyy/p/10985443.html 软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接。 具体用法是:ln -s 源文件 目标文件。 当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的