09 | 基础篇:怎么理解Linux软中断?
倪朋飞
该思维导图由 AI 生成,仅供参考
你好,我是倪朋飞。
上一期,我用一个不可中断进程的案例,带你学习了 iowait(也就是等待 I/O 的 CPU 使用率)升高时的分析方法。这里你要记住,进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被意外打断。所以,短时间的不可中断状态是很正常的。
但是,当进程长时间都处于不可中断状态时,你就得当心了。这时,你可以使用 dstat、pidstat 等工具,确认是不是磁盘 I/O 的问题,进而排查相关的进程和磁盘设备。关于磁盘 I/O 的性能问题,你暂且不用专门去背,我会在后续的 I/O 部分详细介绍,到时候理解了也就记住了。
其实除了 iowait,软中断(softirq)CPU 使用率升高也是最常见的一种性能问题。接下来的两节课,我们就来学习软中断的内容,我还会以最常见的反向代理服务器 Nginx 的案例,带你分析这种情况。
从“取外卖”看中断
你可能要问了,为什么要有中断呢?我可以举个生活中的例子,让你感受一下中断的魅力。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Linux软中断是异步事件处理机制的一部分,本文通过生动的“取外卖”比喻,让读者理解了中断的原理。文章介绍了Linux中断处理过程分为上半部和下半部,以及软中断的类型和如何查看软中断和内核线程的运行情况。通过实际例子和命令演示,读者可以更好地理解软中断的运行机制和相关工作类型。总体而言,本文以通俗易懂的方式介绍了Linux软中断的概念和运行机制,适合初学者快速了解和入门。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》,新⼈⾸单¥68
《Linux 性能优化实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(101)
- 最新
- 精选
- 我来也[D9打卡] ====================================== 问题:怎么理解软中断? 我的理解比较简单粗暴, 硬中断是硬件产生的,比如键盘、鼠标的输入,硬盘的写入读取、网卡有数据了;软中断是软件产生的,比如程序内的定时器、[文中提到的RCU锁]。 再加上今天的上半部下半部,更好的理解了网卡的处理实际是有硬中断和软中断的。 ====================================== 问题:有没有碰到过因为软中断出现的性能问题? 有,且是血淋淋的教训。 之前的c程序用到了别人写的动态库[如:lib.a],在物理机上,进程的cpu利用率在0%;而切换到了云服务器,即使空载,单进程的cpu利用率都有30%+。 以前没经验嘛,各种自查,无结果,但是自己的进程cpu利用率又那么高,总是不安心. 后来才通过vmstat 检测到系统的软中断每秒有100W+次. 最后各自百度,找人,才发现是那个动态库在处理网络收发消息时,使用了usleep(1)来休息,每次休息1纳秒,单次中断的耗时都不止1纳秒. -------------------------------------- 如果是现在,我会如下分析: 1.检测是哪个线程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 1 2.在进程中打印各线程号. 找到是哪个线程.[ 此过程也可以省略 但可以快速定位线程] 3.第一步应该可以判断出来中断数过高. 再使用 cat /proc/softirqs 查看是哪种类型的中断数过高. 4.不知道perf report -g -p XX 是否可以定位到具体的系统调用函数. 5.最终还是要查看源码,定位具体的位置,并加以验证. -------------------------------------- 感觉现在随便怎么分析都可以快速定位到是动态库的锅. 想当初可是好几个月都无能为力啊, 最后还是几个人各种查,搞了一周多才定位到原因. 最后再吐槽下,没有root权限的普通账户真是不方便啊,有些工具只能安装在自己的目录下, 还有些好用的工具根本无权限运行,哎...
作者回复: 嗯嗯,已经是很有经验的老手了😊 大多数情况下 root 权限都是必须的,还是准备个root权限的环境实践吧
2018-12-109152 - Linuxer经常听同事说大量的网络小包会导致性能问题,一直不太理解,从今天的课程来看,是不是大量的小网络包会导致频繁的硬中断和软中断呢?希望老师给予指点,谢谢
作者回复: 正解
2018-12-102122 - ninuxer打卡,day10 用外卖的例子,延伸到网卡的例子,非常形象,👍
作者回复: 👍
2018-12-1027 - 每天晒白牙【D9打卡】 主题:软中断 中断:系统用来响应硬件设备请求的一种机制,会打断进程的正常调度和执行,通过调用内核中的中断处理程序来响应设备的请求。 1.中断是一种异步的事件处理机制,能提高系统的并发处理能力 2.为了减少对正常进程运行进行影响,中断处理程序需要尽快运行。 3.中断分为上下两个部分 (1)上部分用来快速处理中断,在中断禁止模式下,主要处理跟硬件紧密相关的或时间敏感的工作 (2)下部分用来延迟处理上半部分未完成的工作,通常以内核线程的方式运行。 小结: 上半部分直接处理硬件请求,即硬中断,特点是快速执行 下部分由内核触发,即软中断,特点是延迟执行 软中断除了上面的下部分,还包括一些内核自定义的事件,如:内核调度 RCU锁 网络收发 定时等 软中断内核线程的名字:ksoftirq/cpu编号 4.proc文件系统是一种内核空间和用户空间进行通信的机制,可以同时用来查看内核的数据结构又能用了动态修改内核的配置,如: /proc/softirqs 提供软中断的运行情况 /proc/interrupts 提供硬中断的运行情况
作者回复: 👍
2018-12-10219 - 划时代我的心得: 中断过程的工作包括,应答并重新设置硬件,从设备拷贝数据到内存以及反向操作,处理硬件请求,并发送新的硬件请求。 中断处理流程:硬件-->特殊电信号(中断)-->中断处理器-->IRQ线(中断号)-->操作系统内核(调用中断处理程序,上半部)-->ksoftirqd/n(内核线程处理软中断,下半部) 因为中断打断了其他代码的执行(进程,内核本身,甚至其他中断处理程序),它们必须尽快执行完,所以内核把中断处理切分为两部分:上半部,对于时间非常敏感,硬件相关,保证不被其他中断(特别是相同中断)打断的任务,由中断处理程序处理;其他所有能够被允许稍后完成的工作推迟到下半部(任务尽可能放在下半部)。 基于Linux内核2.6,稍后执行的中断下半部使用三种方式实现: 1、软中断,可在所有处理器上同时执行,同类型也可以,仅网络和SCSI直接使用; 2、tasklet,通过软中断实现,同类型不能在处理器上同时执行,大部分下半部处理又tasklet实现; 3、工作队列,在进程上下文中执行,允许重新调度甚至睡眠,如获得大量内存、信号量、执行阻塞式I/O非常有用。 ksoftirqd/n,每个处理器都有一组辅助处理中断的内核线程,专为出现大量软中断处理而设计,避免跟其他重要任务抢夺资源。
作者回复: 👍
2018-12-1114 - 沙皮狗老师,有一点很疑惑。在《Linux内核设计与实现》一书中提到"在2.6以后的内核中提到,目前有三种方式实现中断下半部:工作队列,tasklet和软中断,软中断机制并不完全等同于中断下半部,很多人把所有下半部当成是软中断。"请问这部分怎么理解?麻烦老师解答一下
作者回复: 这儿区分的更细了,tasklet 也是基于软中断的,而工作队列则是用于可以睡眠的下半部处理过程
2019-03-088 - 茴香根老师说软中断是在内核线程ksoftirqd/cpu中运行。思考和疑问,这个内核线程为什么叫线程,不是进程吗?猜测这个线程很特殊,属于内核中的某一进程,而且这个进程还能够直接与挂接的用户空间内存进行交互。
作者回复: 内核管理的任务一般叫线程是因为它们没有独立的虚拟内存空间,并且它也不会去跟用户空间内存交互。
2018-12-1038 - 饼子积累了知识,但是没有遇到优化软中断的情况,不知道在哪些情况下会考虑进去?
作者回复: 软中断问题在大流量网络中最为常见
2018-12-107 - 科学Jia老师老师,女童鞋举手问您,软中断既然是内核方式运行,那就没有可能是应用程序引起,那如果软中断很频繁,作为应用程序该怎么考虑解决内核的问题?很忧伤啊。
作者回复: 当然可能了,比如还是以网络软中断为例,同样发送1GB数据包,每次发送1KB跟每次发送32B带来的结果肯定是不同的。 具体优化方法不要太着急,先定位出根源,之后一般都不难找出解决方法。
2018-12-246 - 一往而深我也来理解一下,先来硬的: 硬件层面,来事情了cpu就必须过来处理,网卡就能存储那么多数据,如果设计成延迟的话可能有丢数据的坑,所以必须过来把数据拿出来放在容量大的地方,然后就进入下半场,软中断,应该就没那么着急了,有时间就给它处理掉,软中断处理过程中应该也是可以再处理硬中断的。意淫一下 不知道对不对啊
作者回复: 对的,硬中断优先处理
2018-12-105
收起评论