当前位置: 首页 > Linux

softirq会吃掉多少CPU?

时间:2023-04-06 06:15:06 Linux

前面的文章讨论了进程上下文切换和系统调用对系统性能的影响。今天再来看一个CPU吃货,软中断。当你使用vmstat或者其他一些工具查看系统的CPU消耗时,你会发现有两列分别列出来,分别是hi和si。分别是硬中断和软中断。由于vmstat单独列出了中断的开销,因此它显示了一个问题。中断吃掉CPU是明确的。我们不需要了解所有软中断的原理,但是站在一个追求性能的开发者的角度,我们需要了解以下几个问题:软中断的成本是多少?服务器上的软中断占用了多少CPU时间?如果你和我一样对以上问题的答案感到好奇,那就关注我吧!软中断的诞生CPU通常专注于处理用户的进程。当外部硬件或软件有消息要通知CPU时,它会通过中断请求(IRQ)来通知CPU。比如当你的鼠标点击,或者磁盘设备读完数据的时候,都会通过中断通知CPU工作已经完成。但是当中断机制应用到网络IO上时,就会出现一点问题。网络数据包收到后的处理工作并不是读取鼠标、键盘、磁盘IO那么简单,而是需要对内核协议栈做大量的处理,才能放入进程的接收缓冲区。如果只用一个中断(硬终端)来处理网络IO,由于硬中断的优先级比较高,CPU会忙于处理大量的网络IO而不能及时响应键盘鼠标,导致操作系统实时运行。如果性能变差,你会感觉机器接连卡死。因此,现代Linux发明了软件中断,配合硬中断来处理网络IO。你可以理解为硬中断只是为了接收数据包。把包收集起来放在“家里”完成工作,很快就完成了,这样CPU就不会延迟响应其他外部高优先级中断。软中断的优先级较低,负责对数据包进行各种处理,从驱动层到网络协议栈,最后将处理后的数据放入socket的接收缓冲区。软中断比硬中断消耗更多的CPU周期,因此我们在本文中重点关注软中断的开销。软中断开销估算前面已经大致介绍了软中断的来龙去脉,那么我们就直接进入本文的主题,软中断开销是多少。好吧,请跟我来计算一下:1)查看softirqs的总耗时首先使用top命令查看softirqs在每个core上的开销比例,在si栏toptop-19:51:24up78days,7:53,2个用户,平均负载:1.30,1.35,1.35任务:923总计,2运行,921睡眠,0停止,0僵尸Cpu(s):7.1%us,1.4%sy,0.0%ni,90.1%id,0.1%wa,0.2%hi,1.2%si,0.0%stMem:65872372ktotal,64711668kused,1160704kfree,339384kbuffersSwap:0ktotal,0kused,0kfree,55542632kcached大约1.2%的时钟cycle是花在软中断上的,也就是说每个core需要12ms。2)查看软中断数,然后使用vmstat命令查看软中断数$vmstat1procs------------memory---------------swap-------io------system-------cpu-------rbswpdfreebuffcachesisobiboincsussyidwast100123171633924455474204006496007390000012313523392445547420400128574022459352920201230988445547452800140552672421352930201230924747452800000000000000000000000000000000000000000003325632823672529300每秒大约有56000次软中断(本机是web服务,网络IO密集型机器,其他中断可以忽略)。3)计算每次软中断耗时机器是16核物理机,所以可以得出每次软中断需要的CPU时间=12ms/(56000/16)次=3.428us从实验数据一次软中断的CPU开销约为3.4us。软中断的上下文切换我们在上一篇文章中计算了一个比较准确的开销时间。这个时间其实包括两部分,一是上下文切换开销,二是软中断内核执行开销。其中,上下文切换与系统调用、进程上下文切换有很多相似之处。让我们对它们做一个简单的比较:1.与系统调用开销的比较。之间的相似之处。“你可以把内核想象成一个不断响应请求的服务器,这些请求要么来自在CPU上执行的进程,要么来自发出中断的外部设备。老板的请求相当于一个中断,客户的请求相当于一个用户态进程发出的系统调用。软中断就相当于一个系统调用,CPU停止当前用户态上下文,保存工作现场,然后进入内核态继续工作两者唯一的区别是系统调用切换到同一个进程的内核态上下文,而软中断切换到另一个内核进程ksoftirqd中。其实早期的系统调用真的是通过汇编指令int(interrupt),当用户态进程发出int$0x80指令时,CPU切换到内核态开始执行system_call函数,后来大家觉得系统call太慢了,因为int指令必须一致安全地执行之后内核应该使用Intel提供的“快速系统调用”sysenter指令,这被认为与中断有一点关系。软中断必须进行这些检查,所以从这个角度来看,中断的开销应该比系统调用的开销要多。根据之前的实验结果,系统调用的开销从200ns开始。没看过这篇文章的同学可以关注我,然后在历史文章里找。2、与进程上下文切换开销的比较与进程上下文切换相比,进程上下文切换是从用户进程A切换到用户进程B。软中断切换是从用户进程A切换到内核线程ksoftirqd。ksoftirqd作为一个内核控制路径,有一个处理程序比一个更高效的用户进程应该是轻量级的,所以上下文切换的开销比进程切换略高。有兴趣的可以继续阅读《深入理解Linux内核》-第5章,根据上面的实验结果,进程上下文切换的开销为3us-5us。没看过这篇文章的同学可以关注我,从历史文章中找找。Linux相关命令top:si栏显示软中断引起的CPU开销vmstat1:in栏显示每秒软中断次数cat/proc/softirqs:显示所有软中断总数,包括TIMER、NET_TX、NET_RX等.篇:1.你认为你的多核CPU是真核的吗?多核“错觉”2、听说你只知道内存,不知道缓存?CPU表示很伤心!3.TLB缓存是个鬼,如何查看TLBmiss?4、进程/线程切换需要多少开销?5、协程比线程好在哪里?6.softirq会吃掉多少CPU?7、一次系统调用的开销是多少?8、一个简单的php请求redis的开销是多少?9、函数调用过多会不会有性能问题?我的是《练内功》。在这里我不是简单地介绍技术理论,也不是只是介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的,分享给你的朋友吧~~~