daemon
线程
daemon
线程被唤醒后会运行do_softirq()
处理软中断- 检查
irq_stat
是否存发生软中断事件 - 调用
softirq_vec
中对应的软中断服务程序 - 再次检查
irq_stat
,如果发现新的软中断,就会唤醒ksoftrqd
线程来处理
- 一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断
- 如果软中断太过频繁,用户进程可能永远无法获得 CPU 时间
ksoftrqd
线程 。如果所有的软中断在短时间内无法被处理完,内核就会唤醒ksoftrqd
处理剩余的软中断 。以下面这张图为例:
文章插图
- 网卡数据就绪,通过硬中断通知 CPU 进行处理
- 硬中断服务程序调用
raise_softirq()
触发软中断 , 唤醒daemon
- 硬中断服务程序退出后,
daemon
被唤醒开始处理软中断 - 遍历过一遍向量表后 ,
daemon
发现仍有未处理的软中断,唤醒ksoftrqd
ksoftrqd
获得 CPU 时间片后,继续处理未完成的软中断
ksoftrqd
其实是一个 nice
值为 0 的普通线程,会进入 cfs_rq
参与调度 , 可以和普通进程公平地使用 CPU 。但如果
ksoftrirqd
长时间得不到 CPU,就会致使软中断的延迟变得很大,因此 ksoftirqd
的实时性是很难得到保障 。典型问题是 ping 延迟:如果 ping 包无法在软中断里得到处理,就会被
ksoftirqd
处理,导致 ping 延迟变得很大 。中断的影响硬中断的优先级很高,但是需要的 CPU 时间极少 。当出现大量硬中断时,可能会引起较多的 CPU 用户态与内核态的切换,但是
interrupt time
不会显著上升 。此外 , 由于部分内核代码是不可重入的(例如,修改寄存器),其执行过程不能打断 。因此这些代码的执行过程中 , 会屏蔽掉硬中断 。
关中断的操作在内核里随处可见,这反过来会给硬中断带来一些影响 。比如 , 进程关中断时间太长会导致网络报文无法及时处理,进而引起业务性能抖动 。
而软中断的执行时间如果太长,就会给用户线程带来延迟,如果
softirq time
很大则很可能意味着用户线程会受到影响 。网络 IO 频繁的应用机器的
softirq time
通常会比较高,可能存在网络连接数过多,或者网络流量过大的情况,ksoftirqd
的优先级与用户线程是一致的,因此,如果软中断处理函数是在 ksoftirqd
里执行的,那它可能会有一些延迟 。时间窃取在 GNU top命令中 ,
steal time
定义为 “虚拟机管理进程 hypervisor
从 VM 窃取的时间” 。该概念是Xen,KVM , VMware 等社区或者厂商推广到Linux社区的 。当系统管理进程和 VM 尝试占用同一物理 CPU 核
pCPU
时,会导致 VM 的虚拟 CPU vCPU
可用的处理器时间减少,从而造成 VM 性能下降 。中虚拟化环境中,可能发生时间窃取的一些情况:
- 多个高负载 VM 的
vCPU
的运行在同个pCPU
上(公有云的 CPU 超卖) - VM 的
vCPU
与线程绑定在了某个特定的pCPU
上,导致虚拟主机vhost
进程处理 I/O 时从这些vCPU
上窃取时间 - 虚拟机监控程序进程(例如监视,日志记录和I/O进程)与 VM 争抢
pCPU
推荐阅读
- 工厂方法在Spring源码中的运用
- OnionArch - 如何实现更新指定字段的通用Handler
- windows C++ 异常调用栈简析
- .NET平台下一个你不知道的框架,我只想说两个字:“牛逼”
- 黄字的笔顺 黄字笔顺
- 抖音超热门的礼物有哪些?2018抖音网红礼物排行榜
- iPad9参数配置_iPad9配置曝光
- 军棋的暗棋怎么玩要详细(二人军棋暗棋翻棋方法)
- 指南针使用的方法(大自然指南针有哪些)
- 如何申请新的QQ号(有qq号如何申请qq号)