为什么在高线程和高频使用中要使用softirq?

16

软中断(softirq)有什么特殊之处,使我们在高频使用场景中使用它,例如网络驱动程序和块驱动程序。

1个回答

27
软中断通常用于完成已处理中断的排队工作,因为它们非常适合这种需求 - 它们具有第二高优先级,但仍保持硬件中断启用。 处理硬件中断是最重要的优先事项,因为如果不能快速处理它们,那么要么会引入太高的延迟并且用户体验会受到影响,要么硬件缓冲区会在中断服务设备之前填满,导致数据丢失。 没有及时为网络适配器提供服务? 它将覆盖fifo中的数据,您将丢失数据包。 没有及时为硬盘提供服务? 硬盘因无处放置结果而停顿排队读取请求。
软中断允许尽可能短地处理服务硬件中断的关键部分; 而不是必须立即在现场处理整个hw中断,可以将重要数据读取到RAM或其他位置,然后启动SoftIrq来完成工作。 这使得禁用硬件中断的时间尽可能短,同时仍以高优先级完成工作。
此文章是该问题的一个不错参考: https://lwn.net/Articles/520076/ 编辑问题:
软中断是可重入的-它们可以在任何CPU上处理。 从我链接的文章中:
引用:

软件中断可以“触发”并抢占当前线程的两个位置之一是在处理硬件中断的末尾; 中断处理程序经常引发softirqs,因此很有意义 (为了延迟和最佳缓存使用)尽快处理它们

加粗部分。 它们可以在行内处理-我相信这意味着它们可以在不引起上下文切换的情况下处理,这意味着我们只要启用硬件中断,就可以直接跳转到SoftIrq,并尽可能少地使用CPU缓存。 所有这些都有助于使SoftIrqs轻量级但灵活,这使它们非常适合高频率处理。
  • 如果需要,它们可以推向另一个CPU,这提高了吞吐量。
  • 启用中断后,它们可以在当前上下文中立即处理,尽可能地保留处理器状态,从而改善延迟。
  • 它们允许硬件中断继续处理,因为这是我们最重要的目标。
  • 如果负载过高且需要从正常用户进程中腾出时间,则可以将它们重新调度到ksoftirqd进程中。

  • 谢谢回答,但我认为那是bottom-halves的定义... 我更关心的是为什么软中断用于高频使用,而不是tasklets或workqueue? - Virendra Kumar
    感谢您的精彩解释。但我仍有一些疑问,例如:
    1. 正如您所说,如果我们有多个 CPU,它们可以被推送到另一个 CPU 上。如果是单个 CPU 架构,则此点使得软中断和任务处理程序性能几乎相同。
    2. 您提到的另一点是,软中断在没有上下文切换的情况下进行处理。如果我没记错的话,这也适用于任务处理程序。只是工作队列在进程上下文中执行。
    - Virendra Kumar
    2
    除了这些机制不是可重入的。它们只能在那个CPU上处理。我认为你是对的 - 在单核机器上,这并不重要。然而,Linux内核的设计旨在尝试从高度并行的机器中获得最佳利用率。如果机器处于高中断负载下,并且您有32个处理器,则尝试分配负载是完全有意义的。SoftIrqs足够灵活,可以实现这一点,而其他方法可能会导致热点,并且可能无法将负载分散到其他CPU上。 - antiduh
    完美的答案..谢谢@antiduh - Virendra Kumar

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接