Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。...-5.15.4/net/core/dev.c 注册网卡收发包(RX/TX)软中断处理函数 open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq...硬中断是昂贵的,因为它们不能被中断。即使有中断 合并(稍后详细描述),中断处理程序将独占一个 CPU 内核 完全地。NAPI 的设计允许驱动程序进入轮询模式而不是被 为每个需要的数据包接收硬中断。...在正常操作下,会引发初始硬中断或 IRQ,然后是 SoftIRQ 处理程序 它使用 NAPI 例程轮询卡。轮询例程有一个预算,它决定了 允许代码的 CPU 时间。.../about-linux-smp_affinity https://web.archive.org/web/20200225050436/http://blog.yufeng.info/archives
2 概念 2.1 软中断概念 linux的中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux的中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...而下半部以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。...不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一...另外,刚刚提到过,软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。那要怎么查看这些线程的运行状况呢?
我们没必要啃明白软中断的所有原理,但从一名追求性能的开发者的角度来看,我们有必要了解以下问题: 1、一次软中断的开销到底多大? 2、你的服务器上被软中断吃掉了多少CPU时间?...1 软中断的诞生 CPU正常情况下都是专心处理用户的进程的,当外部的硬件或软件有消息想要通知CPU,就会通过中断请求(interrupt request,IRQ)的方式来进行。...所以现代的Linux又发明了软件中断,配合硬中断来处理网络IO。硬中断你可以理解只是个收包的,把包收取回来放到“家里”就完事,很快就能完成,这样不耽误CPU响应其它外部高优先级的中断。...软中断消耗的CPU周期相对比硬中断要多不少,所以我们本文来重点关注软中断的开销。 2 软中断的开销估算 前面大致介绍了软中断的来龙去脉,好了直接进入本文的主题上,软中断开销到底多大。...3)计算每次软中断的耗时 该机器是16核的物理实机,故可以得出每个软中断需要的CPU时间是=12ms/(56000/16)次=3.428us 从实验数据来看,一次软中断CPU开销大约3.4us左右 3
软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...调用__local_bh_disable关闭软中断,其实就是设置正在处理软件中断标记,在同一个CPU上使得不能重入__do_softirq函数 6....处理软中断内核线程 之前我说到不能让CPU长时间来处理中断事务,这样会影响系统的响应时间,严重影响用户和系统之间的交互式体验。...这里说的软中断上下文指的就是系统为每个CPU建立的ksoftirqd进程。 看完这个函数,我不得不佩服这个函数设计的精巧!而我更多的从中体会到其中蕴藏的一种做人的道理。...软中断的内核进程中主要有两个大循环,外层的循环处理有软件中断就处理,没有软件中断就休眠。内层的循环处理软件中断,并每循环一次都试探一次是否过长时间占据了CPU,需要调度释放CPU给其它进程。
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...(4)软中断指令 int是软中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n -- 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。...(5)硬中断和软中断的区别 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。...但一个软中断不会抢占另一个软中断,唯一可以抢占软中断的是硬中断。
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。 (4) 软中断指令 int是软中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n – 触发软中断n。...硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。 硬中断是可屏蔽的,软中断不可屏蔽。...但一个软中断不会抢占另一个软中断,唯一可以抢占软中断的是硬中断。
软中断的引入 软中断的出现和linux系统对中断的划分是分不开的。...linux系统将整个中断处理过程分为了两部分,分别为上半部(Top Half)和下半部(Bottom Half),之所以要这样分是因为关闭中断的时间不能过长,也就是在关闭中断期间尽可能少干事,否则影响整个系统的性能...所以linux系统将中断处理分为两部分,在上半部全程关闭中断,下半部打开中断。而在上半部主要干一些和硬件有关的操作,速度快,在下部分做一些耗时的操作。这样一来既能保证系统效率又能处理各种中断。...那linux如何判断软中断是否发生呢?...B: 根据注释, 如果当初处于中断上写文中(硬+软+NMI), 直接返回。 如果不是就调用wakeup_softirqd来唤醒本cpu上的内核线程。
经常有朋友问起软中断的问题......话说我干了这么多年,还从未在VxWorks领域见过这个词儿,孤陋寡闻了 上网搜了一下,软中断应该是Linux的softirq吧,其典型应用就是中断的bottom half。...关于中断,这是嵌入式领域的一个重点词汇,每个OS都支持,从名字来看,肯定是跟硬件有关的。但ISR执行时间过长,就会带来很多麻烦,所以在使用时都会有很多限制。...除了这些限制,不同的OS还提出了不同的solution,例如Linux的这个软中断。既然名字里带个"软",就是用软件(内核线程?)
这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。...更重要的是,总是把一个函数绑定到某个CPU上执行是有风险的,这个CPU可能负荷很重而其它的CPU可能比较空闲。 2 软中断 Linux2.6内核中,软中断的数量比较少。...事实上,只使用了6类软中断,如下表所示: 表4-9 Linux2.6中使用的软中断 软中断 优先级 描述 HI_SOFTIRQ 0 处理高优先级的tasklet TIMER_SOFTIRQ 1 定时器中断...Linux软中断处理程序总是从索引0开始执行。 2.1 软中断使用的数据结构 软中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止软中断。 清除正在执行的软中断对应掩码位。 执行local_irq_enable()使能中断。
其实,在机器启动的时候,系统就已经识别了所有设备,并且也把相应的中断处理器加载到中断表中。 下面是请求CPU关注的两种方式: 基于中断 基于轮询 所有的linux操作系统都是基于中断驱动的。...而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是ksoftirqd/0。...不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和 RCU 锁(Read-Copy Update 的缩写,RCU 是 Linux 内核中最常用的锁之一...TASKLET 在不同 CPU 上的分布并不均匀。TASKLET 是最常用的软中断实现机制,每个 TASKLET 只运行一次就会结束 ,并且只在调用它的函数所在的 CPU 上运行。...软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。那要怎么查看这些线程的运行状况呢?
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。...现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。...在计算机里,中断是一种电信号,由硬件产生,并直接送到中断控制器(如 8259A)上,然后再由中断控制器向 CPU 发送信号,CPU 检测到该信号后,就中断当前的工作转而去处理中断。...光有高级可编程中断控制器的硬件支持还不够,Linux 内核还必须能利用到这些硬件特质,所以只有 kernel 2.4 以后的版本才支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术被称为...更多介绍请参看 Linux 内核源代码自带的文档:linux-2.6.31.8/Documentation/IRQ-affinity.txt 如何使用 先看看系统上的中断是怎么分配在 CPU 上的,很显然
; CPU 软中断状态描述,当某个软中断触发时,__softirq_pending 会置位对应的 bit。...软中断可以在不同的 CPU 上并行运行,在同一个 CPU 上只能串行执行。...DEFINE_PER_CPU(struct task_struct *, ksoftirqd); 注册软中断 中断处理流程中设备驱动通过request_irq/request_threaded_irq...下面我们看下什么时候进行软中断函数回调? 处理软中断 软中断执行的入口就是 invoke_softirq。...什么是中断线程化处理?上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。
1 一个奇怪的问题 了解了软中断对CPU的占用之后,如果你动手操作查看过的话,相信会和我一样会遇到下面这个的问题。...我当时对一台线上虚机查看软中断造成的CPU开销的时候,发现很奇怪,那就是所有的软中断几乎都是被一个CPU处理的。用top看si列,绝大部分都是消耗在CPU1上的,其它CPU只有很少。...# hping3 -S -p 80 -i 你的服务器ip 2 寻找问题原因 网卡和内核交互是通过软中断的方式来进行的。既然是中断,那就每个可中断到CPU的设备就都会有一个中断号。...来,我们现在虚机上找到软中断对应的中断号(可能需要左右滑动)。...刚才我们服务器的包都是发送到eth1上的,它的读队列请求特别的多,因此30号“引脚”上的中断也会特别的多。自然和30亲和的2号CPU,也就是CPU1就会出现明显比其它CPU高的软中断了。
软中断通信简介软中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在软中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。...软中断通信的实现步骤如下:信号发送:发送进程使用kill()函数向接收进程发送信号,信号类型可以自行指定。...signal()函数概述signal()函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。...信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。...signal()与常见信号SIGINTSIGINT是由键盘生成的中断信号,通常由用户按下Ctrl + C组合键发送给前台进程组的所有进程。
软中断和实时性 翻译自:Software interrupts and realtime Linux内核的软中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触软中断...在很早以前,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。...内核通过CPU位掩码来指定需要处理(任意时间可能发生的)软中断的CPU。...例如,当一个内核子系统调用tasklet_schedule()时,会在对应的CPU上设置TASKLET_SOFTIRQ 比特位,当软中断处理完毕后(开中断),会运行微线程 (tasklet基于软中断)。...参考: Linux中断 - softirq
CPU为什么会有主频?为什么主频越快,CPU越快? 软中断 上述外部硬件中断,需要硬件设备触发。 有没有可能,因为软件原因,也触发上⾯的逻辑?有!...为了让操作系统⽀持进⾏系统调⽤,CPU也设计了对应的汇编指令(int或者syscall),可以让CPU内 部触发中断逻辑。 所以: 问题: ⽤⼾层怎么把系统调⽤号给操作系统?...都是直接调⽤ 那是因为Linux的gnuC标准库,给我们把⼏乎所有的系统调⽤全部封装了。 缺⻚中断?内存碎⽚处理?除零野指针错误?...} 缺⻚中断?内存碎⽚处理?除零野指针错误?这些问题,全部都会被转换成为CPU内部的软中断, 然后⾛中断处理例程,完成所有处理。有的是进⾏申请内存,填充⻚表,进⾏映射的。...所以: 操作系统就是躺在中断处理例程上的代码块! CPU内部的软中断,比如int Ox80或者syscall,我们叫做陷阱 CPU内部的软中断,比如除零/野指针等,我们叫做异常。
软中断通信 进程间通信方式有多种,其中软中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...软中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...软中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,软中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用软中断通信的系统时,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。
前些天发现XEN虚拟机上的Nginx服务器存在一个问题:软中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。...在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分软中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿: shell> top Cpu0: 11.3%us, 4.7%sy,...了解了这些基本知识,我们可以尝试换一个CPU试试看会发生什么: echo 7 > /proc/irq/45/smp_affinity_list 再通过「top」命令观察,会发现处理软中断的CPU变成了...好消息是Linux支持RPS,通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能。...最后,推荐看看香草总结的一些关于软中断方面的资料和工具,很全面。
[TOC] 本文基于Linux2.6.32内核版本号。...引言 软中断、tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的“下半部”(bottom half)演变而来。 下半部的机制实际上包含五种,但2.6版本号的内核中。...软中断不能被自己打断(即单个cpu上软中断不能嵌套运行)。仅仅能被硬件中断打断(上半部)。 能够并发运行在多个CPU上(即使同一类型的也能够)。...这也是同一类型软中断能够在多个cpu上并行运行的根本原因。...详细流程图例如以下所看到的: ---- 是否处于中断中在Linux中是通过preempt_count来判断的,详细例如以下: 在linux系统的进程数据结构里,有这么一个数据结构: #define
领取专属 10元无门槛券
手把手带您无忧上云